首先公布答案:在JavaScript 中,
0.1 + 0.2 ≠ 0.3
为什么?
JavaScript 中的数字使用 IEEE 754 标准的双精度浮点数(64 位)进行表示。这种表示方式在处理十进制小数时,不能精确地表示某些数字。比如0.1
和 0.2
这样的十进制小数,在转换成二进制浮点数时会产生无限循环的小数,导致它们在内存中只能近似表示。
0.1
在二进制中表示为一个近似值:0.00011001100110011001100110011001100110011001100110011...
(无限循环)0.2
在二进制中表示为另一个近似值:0.001100110011001100110011001100110011001100110011001101...
(无限循环)
所以计算0.1 + 0.2
时 ,JavaScript 会对这些近似值进行加法运算,结果并不是精确的 0.3
,而是一个稍微偏离的值。
javascript">console.log(0.1 + 0.2); // 输出: 0.30000000000000004
如何处理这个问题?
- 使用容差:在比较两个浮点数时,通常会使用一个很小的容差值来判断它们是否“相等”。
javascript">const range= 1e-10; // 或者更小 console.log(Math.abs(0.1 + 0.2 - 0.3) < range); // 输出: true
- 转为整数进行计算:将浮点数转换为整数后再进行运算,计算后再转换回来。
javascript">console.log((0.1 * 10 + 0.2 * 10) / 10 === 0.3); // 输出: true
- 使用专门的库:如果需要高精度的浮点运算,可以使用像
big.js
或decimal.js
这样的库来处理。
总结
0.1 + 0.2
在 JavaScript 中不等于 0.3
是由于浮点数表示的精度问题。理解这个问题对于处理涉及精确计算的场景非常重要,并且可以使用容差、整数化或者专门的库来应对这些情况。