Javascript 取模 (%) 表现异常

Javascript Modulo (%) behaving strange

我正在尝试计算 (6.6 % 1.1)。我希望这是 0,但我得到 1.0999999999999996。您可以在 javascript 控制台中轻松重现此内容。我猜这是一个内部舍入错误?你是怎么解决这个问题的?

% 运算符以一种不太明显的方式作用于非整数值。在表达式中

n % d

JavaScript 所做的是找到小于 n / d 的最大整数(我将其称为 q 以反映规范)。然后计算乘积 d * q,结果是差值 n - (d * q).

(为简单起见,我忽略了符号问题。)

这个想法让你考虑整数余数:如果 nd 是整数,那么上面的公式就很有意义。取17 % 3。嗯 17 / 35.something,所以 q5 余数是 17 - (5 * 3)2.

在你的例子中,这个过程有点混乱,因为对于标准的 IEEE 754 浮点数,6.6 / 1.1 不是 6;由于用二进制浮点表示十进制浮点值的精度,它比 6 一点点。因此,当计算出q时,结果是5而不是6。因此,答案是 6 - (5 * 1.1)6 - 5.5,这(同样,不精确)仅比 1.1.

小一点点

JavaScript 使用 IEEE 双精度存储浮点数,所以 6.6 是 6.5999999(我猜?)。您可以使用

(66 % 11)/10

以避免错误。

正如其他人所指出的,您看到了 IEEE-754 浮点数的舍入效应。这不是 JavaScript:

独有的
$ python
>>> 6.6 % 1.1
1.0999999999999992

处理float问题的方法是使用任意精度的数学库:

例如 big.js:

x = new Big(6.6)
// Big {s: 1, e: 0, c: Array[2]}
y = new Big(1.1)
// Big {s: 1, e: 0, c: Array[2]}
x.mod(y).toString()
// "0"