【发布时间】:2018-08-21 11:44:56
【问题描述】:
信息
Number.MAX_SAFE_INTEGER = 9007199254740991link
问题
1000000000000 === 999999999999.999999 // Gives output true
1000000000000 === 999999999999.99999 // Gives output true
1000000000000 === 999999999999.9999 // Gives output false
知道为什么会这样吗?
【问题讨论】:
-
简而言之:永远不要期望任何特定的浮点数完全等于任何其他数字。是的,如果你深入研究它,你可能会弄清楚这里到底发生了什么,但是当你一开始就违反了使用不准确浮点数的基本原则时,为什么还要打扰呢?
-
我可以理解为什么浮点运算(如加法)会失败。但是为什么像平等这样的事情会失败呢?
(0.1 + 0.2) === 0.3 // gives false有道理。但不是这个。 -
如果一个值根本不能用浮点数精确表示,它会捕捉到另一个接近 可以 表示的值。这里前两个数字向上取整为
1000000000000,仅仅是因为试图表达它们。 -
当十进制数字转换为 JavaScript
Number时,结果是十进制数字表示的数字四舍五入到浮点数表示的最接近的值。对于“999999999999.99999”和“999999999999.99999”,最接近的可表示值为1000000000000。所以源代码中的999999999999.99999变为1000000000000,然后比较相等性是比较1000000000000和100000000在“999999999999.9999”的情况下,最接近的值是999999999999.9998779296875,所以比较返回false。
标签: javascript floating-point precision