尝试从字符串中解析值 -36.845167 :
double result;
double.TryParse("-36.845167", out result);
结果是 -36.845167000000004
decimal value;
decimal.TryParse("-36.845167", out value);
double result = (double)value;
结果是 -36.845167
为什么会这样?
答案 0 :(得分:2)
两个双打包围-36.845167是-36.84516700000000355430529452860355377197265625和-36.84516699999999644887793692760169506072998046875
它们与3.55112206307239830493927001953125E-15的准确值不同, 分别为3.55430529452860355377197265625E-15。
第一个非常接近,因此它是正确的IEEE 754舍入到最接近的结果。我不知道将C#decimal转换为double所需的标准是什么,但是,假设您在两种情况下使用了相同的输出方法,它可能没有圆到最近。
答案 1 :(得分:1)
这是因为double
精度有限,而decimal
存储十进制数字。在此处阅读更多内容:Difference between decimal, float and double in .NET?
基本上,decimal
更适合存储数字的十进制表示。
修改:更明确地回答原始问题:由于 -36.845167 无法表示为{{1},因此您的两个结果都有点不正确 }}。查看此表达式的输出:
double
对你的两个结果都会看到它们都不等于 -36.845167 :其中一个是 -36.845166999999996 而另一个是 - 36.845167000000004 。
因此,它们都是 4e-15 的原始号码。您在调试器中(或在输出到控制台时)真正看到的只是转换为字符串时的舍入。