2017-02-16 3 views
0

なぜC#フロートトラブル。なぜ1000000 + 0.10f = 1000000ですか?

Console.WriteLine((1000000f + 0.10f).ToString("N2"));

印刷

1 000 000.00

しかし、誰1 000 000.10?

"double"タイプを使用するか、1000000未満の "float"と入力するとこの問題は解決します。

+1

あなたは 'float'(または' Single')の精度の限界に近づいています。 '.ToString(" G9 ")'を実行すると、 '' 1000000.13 "'が得られます。 'float'の最初の7つ(まれに6つ)の小数点にのみ依存することができます。 –

答えて

4

精度/丸めの問題を防ぐために小数点を使用してください。

Console.WriteLine((1000000m + 0.10m).ToString("N2")); 

理由:フロートは7桁(reference)のみ精度を有する - あなたの番号は、MSDNによる8

+0

Fun:「float」を使用して7桁に頼ることができるというMicrosoftの仮定が失敗するいくつかの「ドメイン」があります。たとえば、 '0.000986f.ToString()'と '0.000987f.ToString()'を試してみてください。彼らは '' 0.0009860001 ''と' '0.0009869999" 'をそれぞれ与えます。私はToString()のパラメータのないオーバーロードを使用していることに注意してください。 '.ToString(" R ")'や '.ToString(" G9 ")'で7桁以上を要求することは別の問題です。 –

1

を有し、フロートタイプは、7桁の精度を有します。 1ミリオンは7桁、小数部分は四捨五入されています。

ダブルタイプの精度は15〜16桁であるため、milionの小数部は8-9桁です。 1ミリメートル未満の数字は7桁未満です(小数部なし)。

関連する問題