js中数值计算81.9/100=0.8190000000000001,为啥不是0.819?
发布于 8 年前 作者 jiangliqin 5765 次浏览 来自 问答

js中数值计算81.9/100=0.8190000000000001,为啥不是0.819?

16 回复

因为JS是精度受限的语言,81.9在运算时会换成二进制。

@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里面的数字是浮点型(本身就不精确),四则运算之后那就更不用说了。一般可以这样处理 (81.9X10)/(100X10),这样规避了小数部分,就没有精度的问题了。

不仅是JS,其他语言也有这种情况。

隐藏在 Node.js 浮点反序列化错误背后的故事 http://alinode.aliyun.com/blog/16

之前在mongodb中去存储小数得时候就发现了。

@swfbarhr 投巧的方法,哈哈

回到顶部