有理数不能正确转换为float

时间:2014-11-20 16:17:25

标签: ruby

RUBY_VERSION 2.2.0-preview1

Rational('19/2') # => (19/2) = `.to_f` => 9.5, correct!
Rational(19, 2)  # => (19/2) = `.to_f` => 9.5, correct!

Rational(19/2) # => (9/1) = `.to_f` => 9.0, ???????????????
(19/2).to_r => (9/1), ???????
(19/2).rationalize => (9/1), ??????

对于那些???????,我想知道为什么?

rational

的来源

感谢。

4 个答案:

答案 0 :(得分:3)

因为19 / 2 == 9

您已将9传递给Rational

答案 1 :(得分:3)

如果代码中的任何地方(19/2)不在字符串中,并且包含在Rational()的调用中,则Ruby会在将任何内容传递给Rational之前评估整数除法。在Ruby中,整数除法返回一个整数。在IRB:

2.0.0p0 :001 > 19/2
 => 9 
2.0.0p0 :002 > 19.0/2
 => 9.5 
2.0.0p0 :003 > (19.0/2).to_r
 => (19/2)

这是一个奇怪的行为,Ruby从C继承,其中整数除法的结果总是一个整数。所以,最后,Rational类唯一看到的值是9,它正确地转换为9/1

答案 2 :(得分:2)

因为整数除法19 / 2 => 9已在之前执行以将值发送到Rational

答案 3 :(得分:1)

Ruby正在做的是执行整数除法。即将整数除以另一个整数。

19/2

2进入19 9次。因为分子和分母都是整数,Ruby将返回9。

如果您想返回浮点数,则需要使用浮点除法

19.0/2

由于分子现在是一个浮点数,Ruby知道执行浮点除法。在这种情况下,Ruby将返回9.5的正确答案。