2016-06-14 5 views
0

私は文字列、"999999999999.999"を持っています。私はそれをdoubleに変換したいと思います。私はたくさんのことを試みましたが、いつも間違った番号を返します。 ToDoubleは間違った番号を返します

は、私が試した:

Math.Truncate(Convert.ToDouble("999999999999.999") * 1000)/1000; 

それは私が返されます。99999999999.99902

のみConvert.ToDouble("999999999999.999")は私に同じことを返します。

02の部分が間違っています。

文字列"999999999999.999"を精度または精度を損なうことなくdoubleに変換するにはどうすればよいですか?

+0

私は99999999999.99902を返しますが、999999999999.999が必要です – Curious

+0

は常に3桁の3桁ですか? –

+0

はい、最大3桁の10進数が必要です – Curious

答えて

-1

試してみてください。

double aux = double.Parse("999999999999.999") * 1000/1000; 
double result = Math.Round(aux, 3); 
+1

これはC#ではなくコンパイルされません – spender

+0

VSを開き、 、今自分でテストしました – Oleg

+1

999999999999.99.99に最も近い64ビットIEEE 754バイナリ浮動小数点は999999999999.9990234375です。乗算、除算、または丸めの量は近づくことはできません。 –

3

あなたが正確な精度が必要な場合はありませんが存在することを、追加情報を考えると

0

精度の損失があるだろう倍増への変換中に

10進数に変換小数点の前に12桁以上、3桁目の後には、格納できるすべての数字を区別するのに十分な精度が必要です。

たとえば、最大の数値は99999999999.9990234375で表され、他の小数点以下3桁の数値よりも999999999999.999に近くなります。

小数点以下3桁の小数点以下を四捨五入するように書式を設定する必要があります。

計算を行う場合は、丸め誤差が累積しないように、小数点以下3桁に丸めてDecimalに変換する必要があります。

関連する問題