的物app,谷歌seo好做吗,天津招标信息网,建立网站考虑的三大要素在 js 中进行数学的运算时#xff0c;会出现0.10.20.300000000000000004的结果#xff0c;一开始认为是浮点数的二进制存储导致的精度问题#xff0c;但这似乎不能很好的解释为什么在同样的存储方式下0.30.40.7可以得到正确的结果。本文主要通过浮点数的二进制存储及运算会出现0.10.20.300000000000000004的结果一开始认为是浮点数的二进制存储导致的精度问题但这似乎不能很好的解释为什么在同样的存储方式下0.30.40.7可以得到正确的结果。本文主要通过浮点数的二进制存储及运算和IEEE754下的舍入规则解释为何会出现这种情况。一、浮点数的二进制存储JavaScript遵循IEEE754标准在64位中存储一个数据的有效数字形式。其中第0位为符号位0表示正数1表示负数第1到11位存储指数部分第12到63位存小数部分(尾数部分)(即有效数字)。由于二进制的有效数字总是表示为 1.xxx…的形式尾数部分在规约形式下的第一位默认为1故存储时第一位省略不写尾数部分f存储有效数字小数点后的xxx...最长52位。因此JavaScript提供的有效数字最长为53个二进制位(尾数部分52位被省略的1位)。以0.1、0.2、0.3、0.4和0.7的二进制形式为例0.1-0.0001100110011...(0011无限循环)-0-01111111011-(1 .)1001100110011001100110011001100110011001100110011010(入)0.2-0.001100110011...(0011无限循环)-0-01111111100-(1 .)1001100110011001100110011001100110011001100110011010(入)0.3-0.01001100110011...(0011无限循环)-0-01111111101-(1 .)0011001100110011001100110011001100110011001100110011(舍)0.4-0.01100110011...(0011无限循环)-0-01111111101-(1 .)1001100110011001100110011001100110011001100110011010(入)0.7-0.101100110011...(0011无限循环)-0-01111111110-(1 .)0110011001100110011001100110011001100110011001100110(舍)对于52位之后进行舍入运算此时可看作0舍1入(具体舍入规则在第三部分详细说明)有精度损失。二、对阶运算由于指数位数不同运算时需要进行对阶运算。对阶过程略0.10.2与0.30.4的尾数求和结果分别如下0.10.2-10.01100110011001100110011001100110011001100110011001110.30.4-10.1100110011001100110011001100110011001100110011001101求和结果需规格化(有效数字表示)右规导致低位丢失此时需对丢失的低位进行舍入操作0.10.2-1.00110011001100110011001100110011001100110011001100111-1.0011001100110011001100110011001100110011001100110100(入)0.30.4-1.01100110011001100110011001100110011001100110011001101-1.0110011001100110011001100110011001100110011001100110(舍)即00111-010001101-0110此处同样有精度损失。在这里我们可以发现0.30.4对阶阶运算且规格化后的运算结果与0.7在二进制中的存储尾数相同(可对照尾数后几位)而0.10.2的运算结果与0.3的存储尾数不同且0.10.2转化为十进制时结果为0.300000000000000004。此时虽然0.10.2与0.30.4进行舍入操作的近似位都为1但一入一舍导致计算结果与“标准答案”的异同。三、IEEE754标准下的舍入规则维基百科对最近偶数舍入原则的解释如下舍入到最接近在一样接近的情况下偶数优先(Ties To Even这是默认的舍入方式)即会将结果舍入为最接近(精度损失最小)且可以表示的值但是当存在两个数一样接近的时候则取其中的偶数(在二进制中是以0结尾的)。首先要注意的是保留小数不是只看后面一位或者两位而是看保留位后面的所有位。如图可以看到近似需要看三位保留位(近似后的最低位)、近似位(保留位的后一位)、粘滞位(sticky bit 近似位后的所有位进行或运算后看作一位)。当粘滞位为1时舍入规则可以看作0舍1入近似位为0舍近似位为1入(即第一部分小数二进制存储为52位尾数时所进行的舍入操作)。当粘滞位为0时若近似位为0则舍去。当粘滞位为0时若近似位为1无论舍入精度损失都相同故需取舍入两种结果中的偶数保留位为1时入保留位为0时舍(即第二部分对阶运算规格化时的舍入操作)。四、总结思考由于IEEE754标准这样的“bug”不止在JavaScript中会出现在所有采用该标准的语言中都会存在实际编程中可以通过设置精度保留位数等方式解决。想了解跟多的基础理念指南1、关注我转发评论2、私信发送【电子书】即可领取