数値型のクラスには、integer/float/rational/bigdecimalがあります。
これらは全て数値型のクラスですが、次のような違いがあります。
クラス | 説明 |
---|---|
Integer | 整数を表すクラスで、Rubyにおいて、整数は通常、このクラスで表現される。 |
Float | 浮動小数点数を表すクラス。小数点以下の桁数に制限がなく、精度は一定ではないが、最も動作が速い。 |
Rational | 有理数を表すクラス。分数として表現されます。例えば、 Rational(1, 2) は、 1/2 を表します。Floatより動作が遅いが正確(接尾辞にrをつけるとRationalとしてパースされる) |
BigDecimal | 任意精度の小数を表すクラス。精度が高く、誤差の問題が少ないため、金融関連の計算によく使われる。正確な反面、動作はFloat/BigDecimalと比較すると2〜6倍遅く、最も遅い。0.115e2みたいな値になる。この場合は、10の2乗を意味するので、11.5を表す。また-e2とかも可能。 |
つまり、整数を表す場合はIntergerで良いのですが、小数を扱う場合にはFloat/Rational/BigDecimalのどれにするか適切に選択する必要があります。選択では、速さと正確性を考慮して決定していくこととなります。
例えば、金融機関やショッピングサイトの価格計算などの場合は遅くても正確性が必要です。したがって、BigDecimalが適切です。一方で、特に正確性は求めたり、複雑な計算をしない場合は最も速いFloatが適切です。
<追記>
railsでfloat型かdecimal型どちらを選択すべきか迷いました。
これはプロジェクトの要件次第なので、どれだけの精度を持たせたいかによります。
Bardによると以下の通りです。したがって、〇〇だからこの型にする!というのではなく、きちんとどれだけの精度が求められているのかを確認、把握することが重要ですね。
float型の精度は、小数点以下7桁です。そのため、小数点以下8桁の値を保存すると、約0.0000001の誤差が発生します。
double型の精度は、小数点以下15桁です。そのため、小数点以下8桁の値を保存すると、約0.00000000001の誤差が発生します。
このように、float型とdouble型では、精度に約10000倍の差があります。そのため、精度が重要な場合は、double型を使用することをお勧めします。