为什么 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

提问人:Alex 提问时间:1/9/2012 最后编辑:Manuel SelvaAlex 更新时间:1/9/2012 访问量:282

问:

为什么 4.1%2 返回 0.09999999999999996?但 4.2%2==0.2。

Ruby 浮动精度

评论

1赞 J. Holmes 1/9/2012
对我来说 (Ruby 1.9.2)4.2 % 2 == 0.20000000000000018
0赞 Gangnus 3/6/2012
您可以在此处找到更简单的分析:stackoverflow.com/questions/9136860/...

答:

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

Floats 不能总是精确表示,请参阅

每个程序员都应该知道的浮点运算知识

评论

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?