首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript Modulo (%)行为奇怪

Javascript Modulo (%)行为奇怪
EN

Stack Overflow用户
提问于 2016-06-06 16:11:44
回答 3查看 1.1K关注 0票数 4

我正在计算(6.6 % 1.1)。我希望这是0,但我得到1.0999999999999996。您可以很容易地在javascript控制台中再现这一点。我猜这是个内部舍入错误?你如何解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-06 16:36:15

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

代码语言:javascript
复制
n % d

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

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

这个想法可以让你想到整数余数:如果nd是整数,那么上面的公式是完全有意义的。走17 % 3。好的,17 / 35.something,所以q5,剩下的是17 - (5 * 3)2

在您的例子中,这个过程有点混乱,因为使用标准IEEE754浮点,6.6 / 1.1不是6;由于用二进制浮点表示十进制浮点值的精度,它只是比6小一点点。因此,当计算q时,就会出现5而不是6。因此,答案是6 - (5 * 1.1),或6 - 5.5,它(同样,不精确)只是比1.1少一点点。

票数 4
EN

Stack Overflow用户

发布于 2016-06-06 16:39:46

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

代码语言:javascript
复制
(66 % 11)/10

为了避免错误。

票数 1
EN

Stack Overflow用户

发布于 2016-06-06 16:43:37

正如其他人已经注意到的,您正在看到IEEE-754浮点数的舍入效应。这并不是JavaScript所独有的:

代码语言:javascript
复制
$ python
>>> 6.6 % 1.1
1.0999999999999992

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

例如,使用big.js

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37662162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档