web-dev-qa-db-ja.com

数式で実数データ型を使用すると、誤った結果が返されるのはなぜですか?

今日、丸め誤差の原因を突き止めようとしていたところ、数式で使用されている列の1つが real データ型を使用していることがわかりました。これが、数式の原因となっています。誤った値を返します。

誰かが私に理由を説明できますか

SELECT 776.2384 * cast(100 as real) / 100 

等しい776.2385 while

SELECT 776.2384 * 100 / 100

等しい776.2384

4
Rachel

10進数、浮動小数点、および実数データの使用 、および データ型の優先順位 を参照してください。

2番目のクエリでは、776.2384は10進数です(他の2つの値も同様です)。したがって、計算はそのタイプで行われ、結果は数学的に正確です。

最初に、realを紹介します。他のリテラルはそのタイプにプロモートされ、計算はIEEE754ルールに従って切り上げモードで実行されます。 IEEE 754浮動小数点は正確ではないため、通常、期待する「数学的に正確な」結果は得られません。

上記の記事からの引用:

浮動小数点データ型と実数データ型はおおよその性質であるため、金融アプリケーション、丸めを伴う操作、または等価性チェックなど、正確な数値動作が必要な場合は、これらのデータ型を使用しないでください。代わりに、整数、小数、お金、または小額のデータ型を使用してください。

4
Mat