我有以下虚拟测试脚本:function test(){
var x = 0.1 * 0.2;
document.write(x);}test();这将打印结果0.020000000000000004,只应打印0.02(如果您使用计算器)。据我所知,这是由于浮点乘法精度的误差。有没有人有一个很好的解决方案,以便在这种情况下,我得到正确的结果0.02?我知道有类似的函数toFixed或舍入将是另一种可能性,但我想真正打印整个数字没有任何切割和舍入。只是想知道你们其中一个人是否有一些漂亮,优雅的解决方案。当然,否则我会转到大约10位左右。如何处理JavaScript中的浮点数精度?
4 回答
阿晨1998
TA贡献2037条经验 获得超6个赞
从浮点指南:
我该怎么做才能避免这个问题?
这取决于你正在做什么样的计算。
如果你真的需要你的结果准确地加起来,特别是当你使用钱时:使用特殊的十进制数据类型。
如果您只是不想看到所有这些额外的小数位:只需将结果格式化为显示它时固定的小数位数。
如果您没有可用的十进制数据类型,则可以选择使用整数,例如完全以美分进行货币计算。但这是更多的工作,并有一些缺点。
请注意,第一点仅适用于您确实需要特定的精确十进制行为。大多数人并不需要这样,他们只是因为他们的程序无法正常使用1/10这样的数字而没有意识到如果它以1/3发生它们甚至不会眨眼同样的错误。
如果第一点确实适用于您,请使用BigDecimal for JavaScript,这根本不是优雅的,但实际上解决了问题而不是提供不完美的解决方法。
慕森卡
TA贡献1806条经验 获得超8个赞
你只是在进行乘法运算吗?如果是这样,那么你可以利用一个关于十进制算术的巧妙秘密。就是这样NumberOfDecimals(X) + NumberOfDecimals(Y) = ExpectedNumberOfDecimals
。也就是说,如果我们有,0.123 * 0.12
那么我们知道将有5个小数位,因为0.123
有3个小数位并且0.12
有两个。因此,如果JavaScript给了我们一个数字,0.014760000002
我们可以安全地舍入到小数点后第五位,而不用担心会失去精度。
添加回答
举报
0/150
提交
取消