kidoOooOoooOOom

ゲーム開発やってます

SQLアンチパターンのラウンディングエラー(丸め誤差)

今日たまたまFLOAT型のカラムを見かけてしまったので、これはアンチパターンだったはずとハッとしながら思い出してメモっておくことにした。
FLOAT型を使うと問題なる点としては、2進数では小数点の表現に限界があるため丸められてしまい誤差が起きてしまうという点。
これにより、SQLでSUM関数を使ったときに 0.X(丸め誤差が存在する小数) の値が10個存在した場合に単純に 0.X * 10という値にはならず、別のX.0000Yのような値になってしまう恐れがある。
また、WHERE句で COLUMN = 0.X のような条件式を書いた場合においても、0.Xで格納したはずのデータが内部では 0.X00000Yのような値になっており等価性を保てない場合がある。
これはNUMERIC型やDECIMAL型を使えば回避できるが、そもそもFLOATを使わないで済むのが一番良い方法。