大学生がプログラマーを目指すはなし

ruby, python, AIの話が多いです

少数の丸め誤差をまとめてみる(ruby)

少数を使ったプログラムでたま〜にバグを生み出してしまってイライラしていたので、まとめてみました。

0.1 * 0.2 # => 0.020000000000000004

0.1 * 0.2 == 0.02 # -> false

0.1* 0.2 > 0.02 # => true

なぜこんなことが起きるのかという話は情報工学の分野になるので少々割愛しますが、要は我々人間は数字を10進数で捉えますが、コンピュータは2進数で全てのデータを捉えていて、そこにギャップが生まれています。(詳しく知りたい方は基本情報技術者試験の勉強をしてみてください!)

これによって、if文などで「あれ〜?」みたいなことになる初心者プログラマーがかつての自分でした...

 

- 解決策

Rationalクラスを使いましょう!

これによって、無限小数となっていた少数が有理数(分数)で捉えられるようになります。

0.1r * 0.2r # => (1/50)

0.1r * 0.2r == 0.02 # => true

0.1r * 0.2r > 0.02 # => false

 

これでもう大丈夫!