SQLアンチパターンを読んで (丸め誤差について)

前回(SQLアンチパターン:ポリモーフィック関連)に引き続きSQLアンチパターンについてお話したいと思います。

SQLアンチパターン

丸め誤差と問題点

今回のアンチパターンはカラムのデータ型でFLOAT型を使った場合に生じる丸め誤差です。
プログラムの世界でも小数を扱いたいときにfloat型やdouble型はよく使われていますが、データベースの世界も同様にFLOAT型等が存在します。入力されたデータを2進数で保存するので、float型等を使った場合、10進数の数値を2進数の数値に変換するという処理が入ります。

しかし、2進数では表すことができない小数の値が存在するので、その場合それに近い数字(2進数で表現可能)に近似されたデータが保存されます。
この入力したデータと保存するときに近似されたデータの誤差を丸め誤差と呼びます。

一般的にこの誤差は小さいので無視できるのですが、DBで扱う可能性が高いお金に関する数値等でこのような誤差が少しでも入ると大問題です。

解決策:NUMERIC型やDECIMAL型を使う

丸め誤差に対処するためには、データ型としてNUMERICやDECIMALを使いましょう。NUMERIC等もFLOATと同じように小数等の数値を扱うのですが、データの保存方法に違いがあります。

FLOAT型は10進数の数値を2進数に変換して保存していたのに対して、NUMERIC型は数値を一度、文字列とみなしてその文字列を2進数のデータで保存します。これにより入力されたデータを誤差なく保存することができるのです。

誤差が許されない数値データにはNUMERICやDECIMALを使いましょう!