0
float totalAmount = 0;
.
.
.//totalAmount assigned value 1.05 correctly
.
totalAmount  += float.Parse(dataRow["Amt"].ToString()); //where dataRow["Amt"] has value 4.93

totalAmountに対して得られる答えは、5.98ではなく5.97999554です。

なぜこうなった?

4

3 に答える 3

9

totalAmount累積する前に、1.05であると述べます。これにより、次のような期待される結果が得られます。

1.05
4.93 +
------
5.98

5.97999954が得られます。これは、基本的にIEEE浮動小数点で最もよく表される答えです。これは、すべての10進数を正確に表現できないバイナリ形式です。たとえば、かなり一般的な0.1 10には、無限の2進浮動小数点表現.0001100110011...2があります。

そして、ウィキペディアのリンク、適切な測定のために:http: //en.wikipedia.org/wiki/Floating_point#Accuracy_problems ;)

于 2009-12-15T19:23:35.343 に答える
1

これは、基数2のシステムで基数10の数値を表すためです。

コンピューター上の浮動小数点演算は常にこれを行います。必要な精度のレベルがわかっている場合は、適切な小数表現を使用する必要があります。

于 2009-12-15T19:19:29.657 に答える
0

jdmichalは正しいですが、これを実際に正しく加算したい場合は、Decimal型(10進リテラルを含む)を使用できます。

于 2009-12-15T19:30:05.797 に答える