2016-06-14 89 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

它总是只有三位小数? –

+0

是的,我需要最多三位十进制数字 – Curious

回答

-1

尝试:

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

这不是C#,它不编译。 – spender

+0

不得不打开VS,看看有什么问题哈哈哈,现在自己对其进行测试 – Oleg

+1

最接近999999999999.999的64位IEEE 754二进制浮点数为999999999999.9990234375。乘法,除法或舍入的数量可以接近。 –

3

如果你想确切的精度将其转换为十进制

虽然转换为加倍会有一个精度损失

0

鉴于附加信息不会有超过小数点前12位数字和后3位数字,double应该精确到足以区分所有可以存储的数字。

例如,最大数字由999999999999.9990234375表示,它比999999999999.999更接近于任何其他三位小数位数。

您将需要控制格式,以便您四舍五入到最接近的3位小数位数。

如果您进行任何计算,则应将其转换为小数点后舍入到小数点后3位,以避免累积舍入误差。