Javascript 取模 (%) 表现异常
Javascript Modulo (%) behaving strange
我正在尝试计算 (6.6 % 1.1)。我希望这是 0,但我得到 1.0999999999999996。您可以在 javascript 控制台中轻松重现此内容。我猜这是一个内部舍入错误?你是怎么解决这个问题的?
%
运算符以一种不太明显的方式作用于非整数值。在表达式中
n % d
JavaScript 所做的是找到小于 n / d
的最大整数(我将其称为 q
以反映规范)。然后计算乘积 d * q
,结果是差值 n - (d * q)
.
(为简单起见,我忽略了符号问题。)
这个想法让你考虑整数余数:如果 n
和 d
是整数,那么上面的公式就很有意义。取17 % 3
。嗯 17 / 3
是 5.something
,所以 q
是 5
余数是 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"
我正在尝试计算 (6.6 % 1.1)。我希望这是 0,但我得到 1.0999999999999996。您可以在 javascript 控制台中轻松重现此内容。我猜这是一个内部舍入错误?你是怎么解决这个问题的?
%
运算符以一种不太明显的方式作用于非整数值。在表达式中
n % d
JavaScript 所做的是找到小于 n / d
的最大整数(我将其称为 q
以反映规范)。然后计算乘积 d * q
,结果是差值 n - (d * q)
.
(为简单起见,我忽略了符号问题。)
这个想法让你考虑整数余数:如果 n
和 d
是整数,那么上面的公式就很有意义。取17 % 3
。嗯 17 / 3
是 5.something
,所以 q
是 5
余数是 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"