今日、丸め誤差の原因を突き止めようとしていたところ、数式で使用されている列の1つが real データ型を使用していることがわかりました。これが、数式の原因となっています。誤った値を返します。
誰かが私に理由を説明できますか
SELECT 776.2384 * cast(100 as real) / 100
等しい776.2385
while
SELECT 776.2384 * 100 / 100
等しい776.2384
?
10進数、浮動小数点、および実数データの使用 、および データ型の優先順位 を参照してください。
2番目のクエリでは、776.2384
は10進数です(他の2つの値も同様です)。したがって、計算はそのタイプで行われ、結果は数学的に正確です。
最初に、real
を紹介します。他のリテラルはそのタイプにプロモートされ、計算はIEEE754ルールに従って切り上げモードで実行されます。 IEEE 754浮動小数点は正確ではないため、通常、期待する「数学的に正確な」結果は得られません。
上記の記事からの引用:
浮動小数点データ型と実数データ型はおおよその性質であるため、金融アプリケーション、丸めを伴う操作、または等価性チェックなど、正確な数値動作が必要な場合は、これらのデータ型を使用しないでください。代わりに、整数、小数、お金、または小額のデータ型を使用してください。