例如:
9 / 5 #=> 1
但我预计 1.8
。如何获得正确的十进制(非整数)结果?为什么它会返回 1
?
def method; a - b/8; end
将返回方法的计算结果,因为方法调用中的最后一个表达式是返回值。
它正在做整数除法。您可以使用 to_f
强制进入浮点模式:
9.to_f / 5 #=> 1.8
9 / 5.to_f #=> 1.8
如果您的值是变量而不是文字,这也适用。将一个值转换为浮点数足以将整个表达式强制转换为浮点运算。
它正在做整数除法。您可以通过添加 .0
使其中一个数字成为 Float
:
9.0 / 5 #=> 1.8
9 / 5.0 #=> 1.8
a.to_f / b
,.to_f
的答案会更好。如果您实际上是在将两个硬编码的整数相除(这可能很奇怪),那么使用 9.0 / 5
就可以了。
to_f
更为明确,而将小数 .0
添加到整数则更为隐含。我建议使用 to_f
来让阅读代码的人更加明确,尽管对其他人的意图可能仍然不清楚。
您还可以使用 Numeric#fdiv
方法:
9.fdiv(5) #=> 1.8
您可以使用 irb 进行检查:
$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667
您可以包含 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
。
将 5
更改为 5.0
。你得到整数除法。
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
.to_f
一切?