【发布时间】:2022-01-20 17:50:47
【问题描述】:
我有以下虚拟测试脚本:
function test() {
var x = 0.1 * 0.2;
document.write(x);
}
test();
这将打印结果0.020000000000000004,而它应该只打印0.02(如果您使用计算器)。据我了解,这是由于浮点乘法精度的错误造成的。
有没有人有一个好的解决方案,以便在这种情况下我得到正确的结果0.02?我知道有像toFixed 这样的功能,或者舍入是另一种可能性,但我真的希望打印整数而不进行任何切割和舍入。只是想知道你们中的某个人是否有一些不错的、优雅的解决方案。
当然,否则我会四舍五入到 10 位左右。
【问题讨论】:
-
其实报错是因为没有办法将
0.1映射成有限的二进制浮点数。 -
大多数分数不能以精确的精度转换为小数。一个很好的解释在这里:docs.python.org/release/2.5.1/tut/node16.html
-
@SalmanA:你的 JavaScript 运行时对你隐藏了这个问题并不意味着我错了。
-
不同意 Aaron 的观点,有一些方法可以完美且完全地用二进制编码 0.1。但 IEEE 754 不一定对此进行定义。想象一下一种表示形式,您一方面用二进制编码整数部分,另一方面用小数部分编码,最多 n 位小数,也用二进制编码,就像一个普通整数 > 0,最后是小数点的位置.好吧,您将完美地表示 0.1,没有错误。顺便说一句,由于 JS 在内部使用有限数量的小数,因此他们的开发人员不妨编写代码,以免在最后一个小数上犯错误。