我正在尝试将“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
答案 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)
这里有两件事:
答案 3 :(得分:0)
如果您查看双数据类型的page,您将看到精度为15-16位数。您已达到该类型精度的限制。
我相信在这种情况下,十进制可能就是你所期待的。
答案 4 :(得分:0)
快速测试给了我正确的价值。 double dt = double.Parse(“12345678.12345678”); Console.WriteLine(dt.ToString());