为什么百分之二百三十零* 100没有返回230? [重复](Why does 230/100*1

2019-08-02 08:24发布

可能重复:
是JavaScript的数学坏了吗?

在Javascript中,我想不通为什么230/100*100的回报229.99999999999997 ,而240/100*100返回240.

这也适用于460, 920等...

有没有什么解决办法吗?

Answer 1:

在JavaScript中所有的数字值存储为IEEE 754的64位浮点值(也被称为double许多语言)。 这种表示仅具有有限精度(所以不是所有的数字可以精确地表示),它是二进制的,以便似乎值很容易以十进制表示可以变成是有问题的处理。

有适合大家没有发射后不管的解决方案。 如果你需要一个整数,然后只需绕行Math.round



Answer 2:

问题:

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

测试转换:二进制到/从十进制


与它打交道:

浮点值之间的平等检查时,一定要警惕的精度。 四舍五入向上/向下一定数量的显著数字是很好的做法。



Answer 3:

这个问题涉及到浮点误差。 看到这个问题的更多细节: 是浮点运算坏了吗?



Answer 4:

出于同样的原因,如果你是被迫留到一定的精确度,并采取每一步,你给10/3*39.99999...

假设你必须保持在精度为10位数字。 之后10/3你必须3.333333333 。 然后,当你乘的是3,你必须9.999999999

现在,因为我们知道,三分球将一直持续下去,我们知道,787-9将永远持续下去,所以我们知道,答案是真的10.但在这里,这不是交易,交易你申请的每一步最佳你可以,然后继续下一个。

除了这将导致在反复交涉的数字,有可能是那些可以被精确地表示,但不与您正在使用的位数。

正如10/3不能完全以十进制表示,因此230/100不能完全以二进制表示。



Answer 5:

JavaScript中的划分不是整数除法,但浮点。

2.3或2.4不能在浮动点被精确地表示。 不同的是,为2.4最接近FP是2.4000000953,而2.3是约2.2999999523。

人们可以使用Math.round(x)或一个可以使用JavaScript的技巧:

(X | 0)x转换为整数,作为 '|' 运营商强制操作数为整数。 即使在这种情况下299.9943不圆,但被截断。



文章来源: Why does 230/100*100 not return 230? [duplicate]