例如:

9 / 5  #=> 1

但我以为是1.8。我怎样才能得到正确的十进制(非整数)结果?为什么返回1呢?


当前回答

你可以通过irb查询:

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667

其他回答

这里没有提到Fixnum#to_r,它是从ruby 1.9开始引入的。它将Fixnum转化为理性形式。下面是它的用法示例。这也可以给出精确的除法,只要所有使用的数字都是Fixnum。

 a = 1.to_r  #=> (1/1) 
 a = 10.to_r #=> (10/1) 
 a = a / 3   #=> (10/3) 
 a = a * 3   #=> (10/1) 
 a.to_f      #=> 10.0

对有理数操作的浮点数将结果转换为浮点数的示例。

a = 5.to_r   #=> (5/1) 
a = a * 5.0  #=> 25.0 

可以包含ruby mathn模块。

require 'mathn'

这样,你就能正常地做除法了。

1/2              #=> (1/2)
(1/2) ** 3       #=> (1/8)
1/3*3            #=> 1
Math.sin(1/2)    #=> 0.479425538604203

通过这种方式,您可以得到精确的除法(类Rational),直到您决定应用一个不能表示为有理数的操作,例如Math.sin。

你也可以使用Numeric#fdiv方法:

9.fdiv(5)  #=> 1.8

你可以通过irb查询:

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667

它在做整数除法。你可以使用to_f强制进入浮点模式:

9.to_f / 5  #=> 1.8
9 / 5.to_f  #=> 1.8

如果您的值是变量而不是字面量,这也适用。将一个值转换为浮点数足以将整个表达式强制转换为浮点算术。