var x = dr["NationalTotal"].ToString();
私に333333333をくれます
var xxx = Convert.ToSingle(dr["NationalTotal"].ToString());
私に333333344をくれます
理由はありますか?
var x = dr["NationalTotal"].ToString();
私に333333333をくれます
var xxx = Convert.ToSingle(dr["NationalTotal"].ToString());
私に333333344をくれます
理由はありますか?
これはSingle
、完全な数値を格納するのに十分な精度がないために発生します。
Double
より精度があります。
のドキュメントからSystem.Single
:
すべての浮動小数点数の有効桁数には制限があり、これによって、浮動小数点値が実数にどれだけ正確に近似されるかが決まります。Double 値の精度は最大 7 桁ですが、内部的には最大 9 桁が維持されます。
実際にはではなく ここを意味 しますが、ポイントは有効数字 9 桁に使用しようとしており、それが使用できるとは限りません。これは、解析しなくても非常に簡単に確認できます。Single
Double
float f = 333333333f;
Console.WriteLine("{0:r", f); // Prints 333333344
(「r」は「往復」フォーマット指定子です。)
つまり、float
333333333 の正確な 10 進数値に最も近い値は 333333344 です。
代わりに使用する場合Double
、おそらくすべての数字が保持されますが、それが必ずしも正しいアプローチであるとは限りません。値によって異なります。実際には常に整数ですか?多分あなたは使うべきですlong
。整数ではなく、財務データ (またはその他の「人工的な」値) ですか? その場合は、使用を検討してdecimal
ください。
また、なぜこれを文字列に変換して解析する必要があるのですか? の実行時間タイプはdr["NationalTotal"]
何ですか? キャストするだけでよい場合があります-必要のない文字列変換を使用しないでください。