Node.js控制台浮点数显示规则疑问:为何无法精确表示的数能正常显示?
关于Node.js中0.1显示问题的解惑
嘿,这个困惑太正常了,我刚接触JavaScript的时候也被这个坑过,给你拆解清楚:
二进制浮点数的存储真相
你说得没错,十进制的0.1确实没办法用二进制浮点数精确表示——它对应的是一个无限循环的二进制小数,所以在内存里实际存储的是一个近似值,大概是0.10000000000000000555...这样的数值,只是你看不到而已。控制台的“贴心优化”
Node.js(其实是整个JavaScript引擎)在控制台输出数字时,会做一个最短十进制表示的优化:它不会直接把内存里的完整近似值打印出来,而是会找到那个最短的十进制数,当这个十进制数转换为二进制浮点数后,和内存里存储的数值完全一致。
对于0.1来说,这个最短的十进制数就是0.1本身,所以控制台直接显示0.1,而不是那个长长的近似值。同理,0.1 + 0.1的结果,对应的最短十进制表示正好是0.2,所以也会显示成0.2。什么时候会暴露问题?
你可以试试三个0.1相加:console.log(0.1 + 0.1 + 0.1); // 输出 0.30000000000000004这时候三个近似值累加后的结果,对应的最短十进制数不再是
0.3,所以控制台就会把那个带尾巴的近似值显示出来了。本质原因
这不是Node.js的bug,而是所有遵循IEEE 754双精度浮点数标准的语言都会有的特性,JavaScript用的就是这种64位浮点数来存储所有数字。
内容的提问来源于stack exchange,提问作者alaboudi
相关产品推荐
相关产品推荐

