为什么将值解析为 double return 与将其解析为 decimal 然后转换为 double 的结果不同?
Why does parsing a value as a double return a different result than parsing it as a decimal then casting to a double?
正在尝试从字符串中解析值 -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
这是为什么?
这是因为 double
精度有限,而 decimal
存储小数位。在这里阅读更多:Difference between decimal, float and double in .NET?
基本上,decimal
更擅长存储数字的十进制表示。
编辑:更明确地回答你原来的问题:你的两个结果有点不正确因为-36.845167 不能表示为 double
。查看此表达式的输出:
result.ToString("G20")
在你的两个结果上,你会发现它们都不等于 -36.845167:其中一个是 -36.845166999999996 另一个是 -36.845167000000004。
因此,它们都与您的原始号码相差 4e-15。您在调试器中(或输出到控制台时)真正看到的只是转换为字符串期间的舍入。
两个双括号-36.845167是-36.84516700000000355430529452860355377197265625和-36.84516699999999644887793692760169506072998046=875[=10]
它们与精确值相差 3.55112206307239830493927001953125E-15 和
分别为 3.55430529452860355377197265625E-15。
第一个稍微接近一点,所以它是正确的 IEEE 754 舍入到最近的结果。我不知道将 C# decimal 转换为 double 的标准要求是什么,但是,假设您在这两种情况下使用相同的输出方法,它可能没有完成舍入到最近的。
正在尝试从字符串中解析值 -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
这是为什么?
这是因为 double
精度有限,而 decimal
存储小数位。在这里阅读更多:Difference between decimal, float and double in .NET?
基本上,decimal
更擅长存储数字的十进制表示。
编辑:更明确地回答你原来的问题:你的两个结果有点不正确因为-36.845167 不能表示为 double
。查看此表达式的输出:
result.ToString("G20")
在你的两个结果上,你会发现它们都不等于 -36.845167:其中一个是 -36.845166999999996 另一个是 -36.845167000000004。
因此,它们都与您的原始号码相差 4e-15。您在调试器中(或输出到控制台时)真正看到的只是转换为字符串期间的舍入。
两个双括号-36.845167是-36.84516700000000355430529452860355377197265625和-36.84516699999999644887793692760169506072998046=875[=10]
它们与精确值相差 3.55112206307239830493927001953125E-15 和 分别为 3.55430529452860355377197265625E-15。
第一个稍微接近一点,所以它是正确的 IEEE 754 舍入到最近的结果。我不知道将 C# decimal 转换为 double 的标准要求是什么,但是,假设您在这两种情况下使用相同的输出方法,它可能没有完成舍入到最近的。