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

27 浏览
0 Comments

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

为什么JS会搞砸这么简单的数学运算呢?\n

console.log(.1 + .2)  // 0.3000000000000004
console.log(.3 + .6)  // 0.8999999999999999

\n第一个例子的结果大于正确结果,而第二个例子的结果小于正确结果。???!!!怎么解决这个问题?在进行运算之前是否必须始终将小数转换为整数?我只需要担心加法吗(*和/在我的测试中似乎没有同样的问题)?\n我在很多地方寻找答案。有些教程(比如购物车表单)假装问题不存在,只是简单地把值相加。大师们提供了各种复杂的数学函数的解决方案,或者只是顺便提到JS在数学方面“做得不好”,但我还没有看到一个解释。

0
0 Comments

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

这不仅仅是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的幂的无限和,而语言在某个点将其截断。正是这种截断导致了这些轻微的误差。

解决这个问题的方法是使用一种更精确的数据类型,比如Decimal.js或BigInt.js。这些库提供了更高精度的数学计算功能,可以避免浮点数计算中的精度问题。以下是一个使用Decimal.js解决该问题的示例代码:

const Decimal = require('decimal.js');
const num1 = new Decimal(0.1);
const num2 = new Decimal(0.2);
const sum = num1.plus(num2);
console.log(sum.toString()); // 输出 0.3

通过使用这样的库,我们可以得到更准确的计算结果。但需要注意的是,使用这些库可能会增加计算的时间和资源消耗。因此,在实际应用中,我们需要权衡精度和性能之间的平衡。

总结起来,浮点数计算中的精度问题是由于某些小数无法准确表示为二进制浮点数所导致的。通过使用更精确的数据类型或库,我们可以解决这个问题并获得更准确的计算结果。

0
0 Comments

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

在计算机中,使用的是一种称为二进制浮点数的格式,无法准确地表示像0.1、0.2或0.3这样的数字。当代码被编译或解释时,“0.1”已经被舍入为该格式中最接近的数字,这导致了计算发生之前的小舍入误差。

解决这个问题的方法是使用特定的技巧来处理浮点数计算。例如,可以将浮点数转换为整数进行计算,然后再将结果转换回浮点数。另一种方法是使用特定的库或函数,如Javascript中的toFixed()函数,它可以控制小数点后的位数并返回一个正确的结果。

在这个问题中,我们可以通过访问floating-point-gui.de/basic网站来获得更多关于浮点数问题的详细解释以及如何修复这个问题的信息。

0
0 Comments

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

这不是JS的问题,而是一个更普遍的计算机问题。浮点数不能正确地存储所有的小数,因为它们以二进制形式存储数据。

举个例子:

0.5以二进制的形式存储为b0.1

但是0.1 = 1/10,所以它等于1/16 + (1/10-1/16) = 1/16 + 0.0375

0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ...等等

所以在二进制中,0.1是0.00011...,但是这是无限循环的。

除非计算机在某个点停止计算。所以如果在我们的例子中我们在0.00011停止,我们得到的结果是0.09375而不是0.1。

无论如何,重点是这不取决于编程语言,而是取决于计算机。编程语言所影响的是如何显示数字。通常,编程语言会将数字四舍五入为一个可接受的表示形式。显然,Javascript没有这样做。

所以你需要做的事情(内存中的数字足够准确)就是告诉Javascript在将数字转换为文本时如何进行"漂亮"的四舍五入。

你可以尝试使用sprintf函数,它可以让你对数字的显示方式进行精细控制。

0