1
var x = dr["NationalTotal"].ToString();

私に333333333をくれます

var xxx = Convert.ToSingle(dr["NationalTotal"].ToString());

私に333333344をくれます

理由はありますか?

4

3 に答える 3

6

これはSingle、完全な数値を格納するのに十分な精度がないために発生します。

Doubleより精度があります。

于 2013-10-24T17:03:37.990 に答える
4

のドキュメントからSystem.Single

すべての浮動小数点数の有効桁数には制限があり、これによって、浮動小数点値が実数にどれだけ正確に近似されるかが決まります。Double 値の精度は最大 7 桁ですが、内部的には最大 9 桁が維持されます。

実際にはではなく ここを意味 しますが、ポイントは有効数字 9 桁に使用しようとしており、それが使用できるとは限りません。これは、解析しなくても非常に簡単に確認できます。SingleDouble

float f = 333333333f;
Console.WriteLine("{0:r", f); // Prints 333333344

(「r」は「往復」フォーマット指定子です。)

つまり、float333333333 の正確な 10 進数値に最も近い値は 333333344 です。

代わりに使用する場合Double、おそらくすべての数字が保持されますが、それが必ずしも正しいアプローチであるとは限りません。値によって異なります。実際には常に整数ですか?多分あなたは使うべきですlong。整数ではなく、財務データ (またはその他の「人工的な」値) ですか? その場合は、使用を検討してdecimalください。

また、なぜこれを文字列に変換して解析する必要があるのですか? の実行時間タイプはdr["NationalTotal"]何ですか? キャストするだけでよい場合があります-必要のない文字列変換を使用しないでください。

于 2013-10-24T17:04:26.710 に答える