js中数值计算81.9/100=0.8190000000000001,为啥不是0.819?
因为JS是精度受限的语言,81.9在运算时会换成二进制。
我简单汇总了一下,供参考: http://book.btcnodejs.com/4-技术分享/必须逾越的各种坑.html
@imfly 谢谢大神分享!
@dou4cc 恩,get了,那怎么规避这种问题呢
一种办法是输出四舍五入,另一种用任意精度数
number.toFixed(digits) 参数 digits 小数点后的数字位数,是0~20之间的值,包括0和20,有些实现可以支持更 大的数值范围。如果省略了该参数,将用0代理。
返回值 number的字符串表示,不采用指数计数法,小数点后有固定的digics位数字。如果 必要,该数字会被舍入,也可以用0补足,以便它达到指定的长度。如果number大 于le+21,该方法只调用Number.toString(),返回采用指数计数法表示的字符串。 var n = 12345.6789;
n.toFixed( ); // 返回 12346,注意舍入,没有小数部分
n.toFixed(1); // 返回 12345.7,注意舍入
n.toFixed(6); // 返回 12345.678900,注意补零
(1.23e+20).toFixed(2); // 返回 123000000000000000000.00
(1.23e-10).toFixed(2) // 返回 0.00
@lizhizhou 恩,多谢指点
@zouzhenxing 千分感激,万分感谢,好详细
贴一个链接
不仅是JS,其他语言也有这种情况。
隐藏在 Node.js 浮点反序列化错误背后的故事 http://alinode.aliyun.com/blog/16
之前在mongodb中去存储小数得时候就发现了。
@swfbarhr 投巧的方法,哈哈
JS特性
ieee754