web-dev-qa-db-ja.com

.NETでの10進数の不正確さ

昨日、デバッグ中に何か奇妙なことが起こり、私はそれを本当に説明することができません:

Decimal calculation

Decimal calculations with brackets

だから私はここで明白なことを見ていません、または私は.NETの小数について何かを誤解しましたが、結果は同じではありませんか?

58
10rotator01

Decimalは、精度の制限内で10進数で正確に表現できる値のみを格納できます。ここで22/24 = 0.91666666666666666666666 ...これは、無限の精度または合理的な型を格納する必要があり、丸めた後は22/24に等しくありません。

最初に乗算を実行すると、すべての値が正確に表現できるため、結果が表示されます。

30
phuclv

括弧を追加することで、乗算の前に除算が確実に計算されます。これは 浮動精度の問題 を導入するのに十分な計算に影響を与えるのに十分と思われます。

コンピューターは実際にすべての可能な数を生成できるわけではないので、これを計算に含めることを確認する必要があります

14
Sayse

Decimalの精度はDoubleよりも高いですが、その主な有用な機能は、すべての値人間が読み取れる表現と正確に一致するです。一部の言語で使用できる固定10進数型は、2つの一致精度の固定小数点値の加算または減算も、固定小数点型の整数による乗算も、丸めエラーを引き起こさないことを保証できますが、 Java=にあるような10進数の型は、乗算によって丸めエラーが発生しないことを保証できます。NETにあるような浮動小数点Decimal型は、このような保証はありません。また、10進数型では、丸めエラーなしで除算演算を完了できることを保証できません(丸めが必要な場合にJavaには例外をスローするオプションがあります)。

Decimalを浮動小数点型にすることを決定した人は、小数点の右側にさらに多くの桁を必要とする状況や、左端にさらに多くの桁を必要とする状況で、基本-10またはbase-2の場合、すべての操作で丸めの問題を避けられません。

1
supercat