JavaScript浮点数存储疑问:为何可直接赋值0.3而非近似值?
JavaScript中0.3赋值的真相
其实var blah = .3时,JavaScript存储的依然是0.3的二进制浮点数近似值,你看到的“直接赋值为0.3”只是引擎做了显示优化,核心原因有两点:
存储本质:0.3仍以近似值存储
ECMAScript采用IEEE 754双精度浮点数标准,0.3无法用二进制有限小数精确表示,内存里实际存储的是最接近0.3的二进制浮点数,对应的十进制展开是类似0.299999999999999988897769753748434595763683319091796875的数值。显示优化:引擎自动舍入为最短合法十进制数
当你输出变量或转换为字符串时,JavaScript引擎不会直接输出内存中的完整近似值,而是会寻找最短的十进制数——这个十进制数转换为二进制浮点数后,刚好等于内存里存储的近似值。0.3就是满足这个条件的最短十进制数,所以引擎会显示0.3,而非冗长的近似值。
你可以通过代码验证这一点:
var blah = 0.3; console.log(blah.toPrecision(20)); // 输出 0.29999999999999998890
至于0.1+0.2会显示0.30000000000000004,是因为0.1和0.2的近似值相加后,得到的结果对应的最短十进制数不是0.3,而是那个更长的数值,所以引擎就如实显示了该结果。
内容的提问来源于stack exchange,提问作者user3618109
相关产品推荐
相关产品推荐

