4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyで割り算! なぜ0になる?

Last updated at Posted at 2020-09-21

割り算(除算)の落とし穴をはじめから丁寧に。Rubyを例に扱います。前置きも説明も非常に長いです。結論はこちら

答えが小数になるときは要注意

たとえば「80÷100」をしたい、とします。
期待する答えは「0.8」(ないしはそれと等しい数)ですが…

80 / 100
=> 0

0が返ってきますね。なぜでしょうか?

プログラムとはそういうもの

先ほどの計算が"整数同士の計算"とみなされているからです。「整数同士であってるじゃん」と思うのですが、整数と整数の計算は整数でしか返ってきません。

たとえば「101÷100」もそうです。答えとして「1.01」を返してほしいところですが、次のようになってしまいます。

101 / 100
=> 1

どうやって計算するの?

期待する答えを得るためには、小数の桁まで計算に含める必要があります。「整数としてではなく、小数として計算してね!」と伝えなくてはいけないわけです。日常的には特段意識してやっていないような計算も、プログラムではこれらが違うことを意識して書いてあげる必要があります。

たとえば、次のように書けば、小数の桁も計算のうちであることを伝えることができます。

80.0 / 100
=> 0.8

と書いても良いし、

80 / 100.0
=> 0.8

と書いても良いし、もちろん

80.0 / 100.0
=> 0.8

でも良いですね。

なるほど。でも、これが変数だったら? そういった状況に対応するためにも、次のメソッドを知っておきたいです。

to_fメソッドを使う

Rubyで"小数"として扱いたい時に使えるのがto_fメソッドです。「f」はfloatの「f」、"浮動小数点数"を意味します。(こちらもまた独特の概念ですが、参考にできる記事がたくさんあるのでそちらに譲ります。)
さて、使い方ですが、数値(変数なら変数)の後にto_fをつけるだけです。

80.to_f / 100
=> 0.8

と書いても良いし、

80 / 100.to_f
=> 0.8

と書いても良いし、もちろん

80.to_f / 100.to_f
=> 0.8

でも良いですね。

この方法なら変数がきても大丈夫です。

n = 80

n.to_f / 100
=> 0.8

これで期待する結果が得られましたね。

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?