为什么在Javascript中添加两位小数会产生错误的结果?

可能重复:
JavaScript的数学是否被破坏?

为什么JS搞砸了这个简单的数学?

document.write(.1 + .2)  // 0.3000000000000004
document.write(.3 + .6)  // 0.8999999999999999

第一个例子比正确的结果大,而第二个例子少。 ??? !! 你如何解决这个问题? 在执行操作之前,您是否必须始终将小数转换为整数? 我只需要担心添加(*和/在我的测试中似乎没有相同的问题)?

我在很多地方寻找答案。 有些教程(如购物车表单)假装问题不存在,只是将值相加。 大师们为各种数学功能提供复杂的例程,或提到JS“做得不好”,但我还没有看到解释。


这不是一个JS问题,而是一个更通用的计算机问题。 浮点数无法正确存储所有小数,因为它们以二进制形式存储东西例如:

0.5 is store as b0.1 
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc

so in binary 0.1 is 0.00011... 

但是这是无止境的。 除了电脑必须在某个时候停下来。 所以如果在我们的例子中,我们停在0.00011,我们有0.09375而不是0.1。

无论如何,问题在于,这并不取决于语言,而是取决于计算机。 什么取决于语言是你如何显示数字。 通常,语言将数字四舍五入为可接受的表示形式。 显然JS没有。

所以你必须做的事情(内存中的数字足够准确)只是告诉JS在将它们转换为文本时舍入“很好”的数字。

您可以尝试sprintf函数,它可以很好地控制如何显示数字。


这不仅限于JavaScript,它适用于所有浮点计算。 问题是0.1和0.2和0.3不能完全表示为JavaScript(或C或Java等)浮动。 因此,你看到的输出是由于不准确。

特别是,只有两个幂的一定数量才能完全表示。 0.5 = = 0.1b = 2 ^( - 1),0.25 = 0.01b =(2 ^ -2),0.75 = 0.11b =(2 ^ -1 + 2 ^ -2)都可以。 但是1/10 = 0.000110001100011..b只能表示为2的幂的无穷和,这种语言在某个点上切掉。 它的这种斩波导致了这些轻微的错误。


来自浮点指南:

为什么我的数字,比如0.1 + 0.2加起来不错0.3回合,而我得到一个奇怪的结果,比如0.30000000000000004?

因为在内部,计算机使用的格式(二进制浮点)不能准确地表示数字,如0.1,0.2或0.3。

在编译或解释代码时,您的“0.1”已经以该格式四舍五入到最接近的数字,即使在计算发生之前,这也会导致小的舍入误差。

该网站有详细的解释以及如何解决问题的信息(以及如何根据您的情况决定它是否是问题)。

链接地址: http://www.djcxy.com/p/27447.html

上一篇: Why does adding two decimals in Javascript produce a wrong result?

下一篇: JavaScript adding decimal numbers issue