BigDecimalについて(Ruby)

参考URL

qiita.com

Rubyにおいて小数点の計算はどうなるのだろうか。

> 1.2 -0.9
=> 0.29999999999999993

> 1800 * 1.08
=> 1944.0000000000002

普通に計算すれば答えは「0.3」「1944 」だが、そうはならない。これはコンピュータを使った計算でよくありがちな、 浮動小数点問題である。

小数点の切り捨てなどで言えば、float型やdouble型などの使用が考えられるが、この二つは誤差を含む可能性があるので、金融分野など金額が関わるところの計算では使用できない。お金の計算がある処理で小数点もきっちり計算しなければならないという場面ではBigDecimalを使った方がよい。「小数点だから、floatかdouble」という発想はやめた方がよさそうである。目的に応じて使い分ける必要がある。

(BigDecimal("1800") * BigDecimal("1.08")).ceil
=>1944

(BigDecimal("1.2") - BigDecimal("0.9")) == 0.3
=> true

1.2 - 0.9 == 0.3
=> false

またBigDecimalの引数は文字列であることにも注意が必要である。