Rubyの除算で10進数ではなく整数が返されるのはなぜですか?


256

例えば:

9 / 5  #=> 1

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


4
この値を返すメソッドを実際に使用している場合は、変数に割り当てる必要がないことに注意してください。def method; a - b/8; endメソッド呼び出しの最後の式が戻り値なので、単純にメソッドから計算の結果を返します。
Phrogz、2011年

回答:


268

整数除算を行っています。以下をFloat追加することで、数値aの1つを作成できます.0

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

10
これは機能しますが、以下のto_f回答の方が便利なようです。Rubyではto_fはもっと慣用的ですか?
notapatch

9
.to_fあなたが例えば、整数を含む2つの変数を分割している場合答えは良いですa.to_f / b。2つのハードコードされた整数(おそらく奇妙です)を文字通りに除算している場合は、使用して9.0 / 5も問題ありません。
jefflunt 2016

350

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

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

これは、値がリテラルではなく変数の場合にも機能します。1つの値を浮動小数点数に変換するだけで、式全体を浮動小数点演算に変換できます。


1
これは、受け入れられた回答よりも「レール」回答です。
ショーンライアン

@muistooshort:申し訳ありませんが、複製できません。私はおそらく何か間違ったことをしていました。
Joao Costa

4
@SeanRyanなぜ一般的にRubyではなくRailsなのか。(Ruby on)Rails開発者がこの特定のことを一般的なRuby開発者と異なる方法で行う理由はわかりません。おそらく、私はセマンティクスをほんの少し選んでいるだけで、ほとんどの人は(Ruby on)RailsとRubyをこのような場合の同義語と見なします。
Chinoto Vokro 16

169

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

9.fdiv(5)  #=> 1.8

1
これは私がテストした最速の方法です。より高いパフォーマンスを得る唯一の方法は、最初は浮動小数点であるオペランドを分割することです。構文を学ぶためにRubyで素数ジェネレーターを作成しましたが、今はそれを最適化して何が最もうまくいくかを学びます。ここで私は一緒に入れベンチマークです: 'BASE64'を必要と; 'zlibの'を必要とするプットZlib.inflate(Base64.decode64( "eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + rPgSdiCOi / D / kQ71QBOtAVFLEDly05 + UYQ2H + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux + XuOJ2XdO60dKsjC7aBtyTL5O5hLk ="))
Chinoto Vokro

1つの質問ですが、「10進数」を使用しているように精度を維持できますか?
Adam Aiken

39

あなたはirbでそれをチェックすることができます:

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

26

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


1
mathnモジュールはruby 2.2から非推奨になりました
Meier


6

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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.