可能的重复:
JavaScript 的数学被破坏了吗?
当我尝试在 Chrome 控制台或 Firebug中运行4.08-1.36时,我注意到一个奇怪的行为。当结果应该是 2.72 时,控制台会返回2.7199999999999998作为结果。
我想知道这怎么可能。有任何想法吗?
可能的重复:
JavaScript 的数学被破坏了吗?
当我尝试在 Chrome 控制台或 Firebug中运行4.08-1.36时,我注意到一个奇怪的行为。当结果应该是 2.72 时,控制台会返回2.7199999999999998作为结果。
我想知道这怎么可能。有任何想法吗?
这是因为您正在处理浮点数。虽然整数值在给定范围内具有一定数量的可能性(即,从 0 到 9(包括 0 到 9)恰好有 10 个值),但一旦开始添加小数点值,您最终会得到无限数量的可能性。为了能够将这些值存储在固定的内存空间中,计算机应用浮点算法,该算法使用近似值,允许将广泛的数字存储在该固定的内存空间中。由于这种近似,您有时可能会得到像您这样看似奇怪的结果,这几乎但不完全是您所期望的结果。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Floating_point。
计算机以二进制而不是十进制存储数字。正如你不能用十进制形式精确表示分数 1/3,你不能用二进制精确表示分数 1/10,这意味着有许多值可以用十进制形式精确表示,但不能用二进制形式表示。
您示例中的所有数字都属于这一类。在二进制中,十进制数 4.08 变为 100.00010100011110101110...,二进制点之后的那些数字永远重复。另一个值 1.36 变为 1.01011100001010001111 ....,它们的差值 2.72 变为 10.10111000010100011110 ... 在每种情况下,也具有无限重复的二进制分数。
当转换回十进制以供人类查看时,计算机会四舍五入到最接近的匹配,这并不总是预期的确切值。