Javascript Modulo(%)表现得很奇怪

时间:2016-06-06 16:11:44

标签: javascript modulo

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

3 个答案:

答案 0 :(得分:3)

gsutil rsync -d -r data gs://mybucket/data 运算符以不完全明显的方式处理非整数值。在表达式中

%

JavaScript所做的是找到小于n % d 的最大整数(我称之为q以反映规范)。然后,它会计算产品n / d,结果就是差异d * q

(为了简单起见,我忽略了标志问题。)

这个想法让你想到整数余数:如果n - (d * q)n是整数,那么上面的公式就非常有意义了。拿d17 % 3 17 / 35.somethingq5,其余为17 - (5 * 3)2

在您的情况下,由于使用标准IEEE 754浮点,6.6 / 1.1不是6,因此该过程有点混乱;由于精确表示具有二进制浮点的十进制浮点值,它只比<{em>少小于6。因此,在计算q时,它会显示为5而不是6。因此答案为6 - (5 * 1.1)6 - 5.5,这是(再次,不精确)仅比1.1小一点。

答案 1 :(得分:1)

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

(66 % 11)/10

以避免错误。

答案 2 :(得分:0)

正如其他人所说,你会看到IEEE-754浮点数的舍入效应。这对JavaScript来说并不是唯一的:

$ python
>>> 6.6 % 1.1
1.0999999999999992

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

例如,使用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"