翻倍.解析转换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
具有双精度值的浮点运算本身具有有限精度。双精度值中只有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 ());
这里有两件事:
-
十进制到双精度的转换是不精确的/双精度类型不能很好地映射到整数(至少在十进制系统中)
-
Double的小数位限制为15-16位