转换8位小数字符串时Double.Parse丢失精度

时间:2011-12-02 16:41:15

标签: c# .net string double

我正在尝试将“12345678.12345678”转换为double,但Double.Parse将其更改为12345678.123457。当我使用Decimal而不是double

时也是如此
   decimal check = Decimal.Parse("12345678.12345678", NumberStyles.AllowDecimalPoint);//returns 12345678.123457
    double check1 = (Double)check; //returns 12345678.123457

5 个答案:

答案 0 :(得分:4)

具有双精度值的浮点算法固有地具有有限精度。双精度值中只有15-16个有效十进制数字的信息。您看到的行为完全符合预期。

closest representable double precision value至12345678.12345678是12345678.1234567798674106597900390625,与您观察到的行为相符。

答案 1 :(得分:1)

浮点类型只有这么多有效数字:在System.Double的情况下为15或16(确切的数字随值而变化)。

System.Double的文档涵盖了此内容。

读取What Every Computer Scientist Should Know About Floating-Point Arithmetic值得。

答案 2 :(得分:0)

这里有两件事:

  1. decimal双转换是不精确的/ double类型具有精度,它不能很好地映射到整数(至少在十进制系统中)

  2. Double的小数位数限制为15-16个

  3. Reference用于十进制到双倍转换;

答案 3 :(得分:0)

如果您查看双数据类型的page,您将看到精度为15-16位数。您已达到该类型精度的限制。

我相信在这种情况下,十进制可能就是你所期待的。

答案 4 :(得分:0)

快速测试给了我正确的价值。 double dt = double.Parse(“12345678.12345678”);             Console.WriteLine(dt.ToString());