Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

丸め誤差

浮動小数点数を扱う時は誤差によって結果が変わることがあります。

a = 0.1 + 0.2
b = 0.3
p a == b  #=> false

計算した結果と同じ数値を比較したのにfalseになりました。これは浮動小数点数が1/5や1/3などの数を2進数表現では正確に表せないからです。そのような数を2進数で表すには、適当なところで値を打ち切らないといけません。そのように切り捨てた分の値が誤差となって結果に出ます。
そのため、数値リテラルの少数点を計算した結果が等しいかを==演算子で比較してはいけません。
Rubyの浮動少数点数の計算の精度を上げるには、BigDecimalライブラリを使います。BigDecimalクラスは10進数の少数点で計算をおこなうため、2進数の変換によって生じる丸め誤差がなくなり、浮動少数点の計算の精度が上がります。

require 'bigdecimal'
a = BigDecimal("0.1") + BigDecimal("0.2")
b = BigDecimal("0.3")
p a == b  #=> true

浮動少数点数を計算する精度が上がったことにより、比較した結果がtrueになりました。
ただし、BigDecimalライブラリも浮動少数点数で計算をおこなっているので、丸め誤差の問題がなくなったわけではありません。計算の精度が上がって==演算子で比較できるぐらいの誤差になったのです。浮動少数点数を使っている限り、丸め誤差や桁落ちの問題はなくなりません。


次のコンテンツ ホームへ戻る