web-dev-qa-db-ja.com

Rubyの除算が10進値ではなく整数を返すのはなぜですか?

例えば:

9 / 5  #=> 1

しかし、私は1.8を期待しました。 10進数(整数ではない)の正しい結果を得るにはどうすればいいですか?なぜそれが1をまったく返さないのですか?

236
ErwinM

整数除算をしています。 .0を追加することで、数字の1つを Float にすることができます。

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8
245
vees

整数除算をしています。 to_fを使用して、物事を強制的に浮動小数点モードにすることができます。

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

これはあなたの値がリテラルではなく変数である場合にも有効です。 1つの値をfloatに変換すると、式全体を浮動小数点演算に変換するのに十分です。

327
mu is too short

代わりに使用できる Numeric#fdiv メソッドもあります。

9.fdiv(5)  #=> 1.8
161
Konrad Reiche

Irbで確認できます。

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

Rubyのmathnモジュールを含めることができます。

require 'mathn'

このようにして、あなたは普通に分割をすることができるでしょう。

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

このようにして、Math.sinのように、有理として表現できない演算を適用することを決定するまで、正確な除算(クラスRational)が得られます。

25
Rok Kralj

55.0に変更してください。あなたは整数除算を得ています。

10
Tyler Eaves

Fixnum#to_rはここでは言及されていません。Ruby1.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 
5
Ucpuzz