为什么将值解析为double会返回与将其解析为小数然后转换为double的结果不同的结果?

时间:2015-10-05 04:46:45

标签: c# double decimal

尝试从字符串中解析值 -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

为什么会这样?

2 个答案:

答案 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 的原始号码。您在调试器中(或在输出到控制台时)真正看到的只是转换为字符串时的舍入。

相关问题