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

为什么在Javascript中添加两个小数会产生错误的结果?,javascript,math,floating-point,addition,decimal,Javascript,Math,Floating Point,Addition,Decimal,可能重复: 为什么JS搞砸了这个简单的数学 console.log(.1+.2)//0.30000000000000004 console.log(.3+.6)//0.8999999999999它与计算机如何处理浮点数有关。您可以在这里了解更多信息:这对于所有编程语言来说都是正常的,因为并非所有的十进制值都可以用二进制表示。请参见这不是仅限于javascript的限制,它适用于所有浮点计算。问题是0.1、0.2和0.3不能准确地表示为javascript(或C或Java等)浮动。因此,您看到

可能重复:

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

console.log(.1+.2)//0.30000000000000004

console.log(.3+.6)//0.8999999999999
它与计算机如何处理浮点数有关。您可以在这里了解更多信息:

这对于所有编程语言来说都是正常的,因为并非所有的十进制值都可以用二进制表示。请参见

这不是仅限于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.0001100011..b只能表示为2的无穷幂和,语言在某一点上会截断。正是这种斩波导致了这些微小的错误。

来自:

为什么我的数字不能像0.1+0.2那样 加起来就是一个漂亮的0.3轮,然后 相反,我得到了一个奇怪的结果,比如 300000000000000004?

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

当代码被编译或 已解释,您的“0.1”已 四舍五入到该表中最接近的数字 格式,这将导致 舍入误差甚至在 计算发生了


该网站提供了关于如何解决问题的详细解释和信息(以及如何确定这是否是您的问题)。

这不是一个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
功能,该功能可以让您很好地控制如何显示数字。

检查此问题的答案:此论坛和每个与编程相关的论坛可能有数千个问题的重复。再次?!我们真的需要写一个常见问题。@Andreas:我写了。请参阅我答案中的链接。对于包含字符串9999999的问题,应该有一个特殊的处理程序。更简单的答案。有关此问题的详细信息,请参阅