繁体   English   中英

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

[英]Double.Parse losing precision when converts 8 decimal places string

我试图将“ 12345678.12345678”转换为双精度,但是Double.Parse将其更改为12345678.123457。 当我使用十进制而不是双精度时,情况也是如此

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

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

与12345678.12345678 最接近的可表示双精度值是12345678.1234567798674106597900390625,与您观察到的行为一致。

浮点类型只有很多有效数字:对于System.Double(实际数字随值而变化)为15或16。

System.Double的文档对此进行了介绍。

阅读每位计算机科学家应该知道的有关浮点运算的知识是值得的。

这里有两件事:

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

  2. 精度数的小数位数限制为15-16位

十进制到双精度转换的参考

如果您查看double数据类型的页面 ,您会看到精度为15至16位数字。 您已经达到类型精度的极限。

我相信在这种情况下,Decimal可能就是您想要的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM