提问人:Alex 提问时间:1/9/2012 最后编辑:Manuel SelvaAlex 更新时间:1/9/2012 访问量:282
为什么 4.1%2 使用 Ruby 返回 0.09999999999999996?但 4.2%2==0.2
Why 4.1%2 returns 0.0999999999999996 using Ruby?But 4.2%2==0.2
答:
0赞
Oliver Charlesworth
1/9/2012
#1
因为你在浮点工作。二进制浮点不能完全表示 0.1。
5赞
Manuel Selva
1/9/2012
#2
看这里: 每个程序员都应该知道的关于浮点运算的知识
实数是无限的。计算机使用有限数量的位(32 位,今天的 64 位)。因此,计算机完成的浮点运算不能表示所有实数。0.1 是这些数字之一。
请注意,这不是与 Ruby 有关的问题,而是与所有编程语言有关的问题,因为它来自计算机表示实数的方式。
评论
1赞
Oliver Charlesworth
1/9/2012
这篇论文经常被引用在回答此类问题时,但它实际上不是针对初学者的。
0赞
Manuel Selva
1/9/2012
我同意,但我不知道关于这个主题的其他更简单的文件。是吗?
0赞
Ned Batchelder
1/9/2012
请参阅我在其他地方对这个问题的回答。
0赞
Alex
1/10/2012
事实上,我(初学者)真的很难理解这篇论文。但至少我已经知道为什么会这样。谢谢你的帮助。
0赞
Manuel Selva
1/10/2012
我同意,但别担心,我认为第一页足以清楚地回答您的问题。
1赞
Michael Kohl
1/9/2012
#3
Float
s 不能总是精确表示,请参阅
评论
0赞
Oliver Charlesworth
1/9/2012
这篇论文经常被引用在回答此类问题时,但它实际上不是针对初学者的。
1赞
Michael Kohl
1/9/2012
是的,但我宁愿让 OP 来决定这篇论文是否对他有好处,而不是为他决定。
1赞
Ned Batchelder
1/9/2012
#4
下面是关于浮点的另一个页面:http://docs.python.org/tutorial/floatingpoint.html。它来自 Python 文档,但对于所有使用固定大小的二进制浮点数的语言都是如此。
1赞
Rick Regan
1/9/2012
#5
在双精度中,4.1 = 4.09999999999999999447286321199499070644378662109375 和 4.2 = 4.20000000000000017763568394002504646778106689453125。换句话说,十进制 4.1 的二进制近似值略低于您的预期,而十进制 4.2 的二进制近似值略高。
现在为什么 0.200000000000000017...四舍五入为 0.2 但 0.0999999999999999644...不是四舍五入到 0.1?Ruby 可能将所有输出四舍五入到 15 位有效十进制数字。
评论
0赞
Rick Regan
1/9/2012
尽管 @32bitkid 的 Ruby(来自上面的评论)似乎四舍五入到 17 位。您使用的是哪个版本的 Ruby?
评论
4.2 % 2 == 0.20000000000000018