翻倍.解析转换8位小数点后的字符串时丢失的精度

本文关键字:字符串 精度 转换 8位 小数点 翻倍 | 更新日期: 2023-09-27 18:16:34

我试图将"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

翻倍.解析转换8位小数点后的字符串时丢失的精度

具有双精度值的浮点运算本身具有有限精度。双精度值中只有15-16位有效的十进制数字。你看到的行为完全符合预期。

与12345678.12345678最接近的双精度值是12345678.1234567798674106597900390625,它符合你观察到的行为

浮点类型只有这么多有效数字:对于System来说是15或16。两倍(具体数值随值而异)

System.Double的文档涵盖了这一点。

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

如果您查看双数据类型的页面,您将看到精度为15-16位。你已经达到了类型精度的极限。

我相信在这种情况下,十进制可能是您正在寻找的。

只是一个快速测试给了我正确的值。double dt = double. parse ("12345678.12345678");Console.WriteLine (dt.ToString ());

这里有两件事:

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

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