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), ??????
对于那些???????,我想知道为什么?
的来源感谢。
答案 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的正确答案。