关于数学:为什么Ruby中的除法返回整数而不是十进制值?

Why is division in Ruby returning an integer instead of decimal value?

例如:

1
9 / 5  #=> 1

但我期待1.8。 如何获得正确的十进制(非整数)结果? 为什么它会返回1


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

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

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


它正在进行整数除法。您可以通过添加.0将其中一个数字设为Float

1
2
9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8


还有Numeric#fdiv方法,您可以使用它:

1
9.fdiv(5)  #=> 1.8


你可以用irb检查它:

1
2
3
4
5
6
7
$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667


您可以包含ruby mathn模块。

1
require 'mathn'

通过这种方式,您将能够正常进行划分。

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

这样,您就可以获得精确的除法(类Rational),直到您决定应用不能表示为有理的操作,例如Math.sin


5更改为5.0。你得到整数除法。


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

1
2
3
4
5
 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

在有理数上运算的浮点将结果转换为浮点的示例。

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