[Ruby] 整数同士の割り算

More than 3 years have passed since last update.

整数同士の割り算について紹介。

ただし、Rubyの割り算について完全に網羅している記事ではないことを断っておきます。


商だけ欲しいとき(小数点以下を気にしないとき)

/(スラッシュ)やdivを使います。

 654321/123456        # =>  5

-654321/123456 # => -6
654321/-123456 # => -6
-654321/-123456 # => 5
654321.div(123456) # => 5
-654321.div(123456) # => -6
654321.div(-123456) # => -6
-654321.div(-123456) # => 5


商と剰余が欲しいとき

divmodを使います。ただし、被除数と除数の正負によっては計算結果が変わってくるので注意が必要です。

 654321.divmod(123456)   # => [5, 37041]

-654321.divmod(123456) # => [-6, 86415]
654321.divmod(-123456) # => [-6, -86415]
-654321.divmod(-123456) # => [5, -37041]


結果を浮動小数点数として欲しいとき

被除数または除数に対してto_fを使います。

 654321.to_f/123456        # =>  5.300034020217729

-654321.to_f/123456 # => -5.300034020217729
654321.to_f/-123456 # => -5.300034020217729
-654321.to_f/-123456 # => 5.300034020217729

しかし、これでは見栄えが悪いですね。(主観的ですが...)

公式のdocumentを見てみると、fdivというメソッドが使えることが分かります。

 654321.fdiv(123456)   # =>  5.300034020217729

-654321.fdiv(123456) # => -5.300034020217729
654321.fdiv(-123456) # => -5.300034020217729
-654321.fdiv(-123456) # => 5.300034020217729

これで被除数と除数の関係がスッキリ分かるようになりました!


結果を分数として欲しいとき

quoやRationalクラスを使います。

 654321.quo(123456)         # =>  218107/41152

-654321.quo(123456) # => -218107/41152
654321.quo(-123456) # => -218107/41152
-654321.quo(-123456) # => 218107/41152
Rational(654321, 123456) # => 218107/41152
Rational(-654321, 123456) # => -218107/41152
Rational(654321, -123456) # => -218107/41152
Rational(-654321, -123456) # => 218107/41152


mathnライブラリによる罠

scivolaさんより。

整数同士の割り算では、mathnライブラリをrequireする位置によって「/」の挙動が変わるというものです。

9/4 # => 2

require 'mathn'
9/4 # => 9/4

演算結果が前者ではIntegerとなり、後者ではRationalとなっています。

また、被除数が除数の整数倍の場合、mathnをrequireした後でもIntegerを返します。

9/3 # => 3

require 'mathn'
9/3 # => 3

なお、mathnはRuby2.2.0以降非推奨(deprecated)になっています。

mathnのこのような挙動により、汎用ライブラリ作成者は整数同士で除算を意識する場合、/ではなくdivを使うことが推奨されています。


逆に、汎用ライブラリの作者の方々は、この mathn が require される可能性を留意して書いて下されば親切だと思います。 整数同士で整除を意図するならば / メソッド ではなく div メソッド を用いると良いでしょう。

library mathn - Ruby 2.2.0 リファレンスマニュアル より



参考

[ruby] 割り算で小数点以下も必要な場合

Class: Fixnum (Ruby 2.2.1) #fdiv(numeric) → float

Class: Rational (Ruby 2.2.1)

library mathn - Ruby 2.2.0 リファレンスマニュアル