可能重复:
是JavaScript的数学坏了吗?
在Javascript中,我想不通为什么230/100*100
的回报229.99999999999997
,而240/100*100
返回240.
这也适用于460, 920
等...
有没有什么解决办法吗?
可能重复:
是JavaScript的数学坏了吗?
在Javascript中,我想不通为什么230/100*100
的回报229.99999999999997
,而240/100*100
返回240.
这也适用于460, 920
等...
有没有什么解决办法吗?
在JavaScript中所有的数字值存储为IEEE 754的64位浮点值(也被称为double
许多语言)。 这种表示仅具有有限精度(所以不是所有的数字可以精确地表示),它是二进制的,以便似乎值很容易以十进制表示可以变成是有问题的处理。
有适合大家没有发射后不管的解决方案。 如果你需要一个整数,然后只需绕行Math.round
。
230/100*100
= (230 / 100) * 100
= 2.3 * 100 in binary
2.3 二进制是循环小数: 10.01001100110011001100110011001100...
这循环小数,不能精确地表示,由于精度的限制 ,我们得到类似2.29999999981373548507...
。
有趣的是,如果你选择像这样的除法运算,这是准确表示的( 不循环小数及全躺由FP标准容纳的最大显著数字中的数字 )以二进制,你不会看到任何这样的差异。
例如225/100*100
= 225
2.25
二进制是10.01
测试转换:二进制到/从十进制
浮点值之间的平等检查时,一定要警惕的精度。 四舍五入向上/向下一定数量的显著数字是很好的做法。
这个问题涉及到浮点误差。 看到这个问题的更多细节: 是浮点运算坏了吗?
出于同样的原因,如果你是被迫留到一定的精确度,并采取每一步,你给10/3*3
为9.99999...
。
假设你必须保持在精度为10位数字。 之后10/3
你必须3.333333333
。 然后,当你乘的是3,你必须9.999999999
。
现在,因为我们知道,三分球将一直持续下去,我们知道,787-9将永远持续下去,所以我们知道,答案是真的10.但在这里,这不是交易,交易你申请的每一步最佳你可以,然后继续下一个。
除了这将导致在反复交涉的数字,有可能是那些可以被精确地表示,但不与您正在使用的位数。
正如10/3
不能完全以十进制表示,因此230/100
不能完全以二进制表示。
JavaScript中的划分不是整数除法,但浮点。
2.3或2.4不能在浮动点被精确地表示。 不同的是,为2.4最接近FP是2.4000000953,而2.3是约2.2999999523。
人们可以使用Math.round(x)
或一个可以使用JavaScript的技巧:
(X | 0)x转换为整数,作为 '|' 运营商强制操作数为整数。 即使在这种情况下299.9943不圆,但被截断。