例如:
9 / 5 #=> 1
但是我期望得到的是1.8
。该怎么获得正确的小数(非整数)结果?为什么它返回了1
?
9 / 5 #=> 1
但是我期望得到的是1.8
。该怎么获得正确的小数(非整数)结果?为什么它返回了1
?
to_f
将其强制转换为浮点模式:9.to_f / 5 #=> 1.8
9 / 5.to_f #=> 1.8
如果你的值是变量而不是文字,这个方法同样适用。将一个值转换为浮点数就足以将整个表达式强制转换为浮点算术。
.to_f
转换? - stevec这是整数除法,您可以通过添加.0
使其中一个数字成为Float
类型:
9.0 / 5 #=> 1.8
9 / 5.0 #=> 1.8
a.to_f / b
,那么使用 .to_f
更好。如果你要除以硬编码的两个整数(这可能有点奇怪),则使用 9.0 / 5
就可以了。 - jeffluntto_f
更加明确,而在整数后添加小数点 .0
更加隐含。我建议使用 to_f
更加明确,以便任何人阅读代码,尽管对于其他人来说仍然可能不清楚意图是什么。 - CTS_AE你也可以使用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
def method; a - b/8; end
将从方法返回计算结果,因为在方法调用中的最后一个表达式是返回值。 - Phrogz