C#中decimal带括号与不带括号运算结果差异原因咨询
为什么C#中decimal表达式加括号和不加括号结果不同?
先看你给出的代码:
int fahrenheit = 94; // 带括号的写法 decimal celsius = (fahrenheit - 32m) * (5m / 9m); Console.WriteLine(celsius); // 输出:34.444444444444444444444444447 // 去掉括号的写法 decimal celsius = (fahrenheit - 32m) * 5m / 9m; Console.WriteLine(celsius); // 输出:34.444444444444444444444444444
核心原因:运算顺序不同导致舍入时机差异
C#的decimal是128位高精度十进制类型,最多支持28-29位有效数字,运算时遵循银行家舍入法(四舍六入五成双),两种写法的运算顺序不一样,直接影响了舍入发生的节点:
带括号的情况:先除法后乘法
- 第一步计算
5m / 9m:这是无限循环小数0.(4),decimal无法存储完整的循环值,会先将结果舍入到29位有效数字,得到0.5555555555555555555555555556(第29位是4,后续的循环位触发进位)。 - 第二步计算
(94-32) * 上述结果:62m * 0.5555555555555555555555555556 = 34.4444444444444444444444444472,最终输出时舍入到28位,得到34.444444444444444444444444447。
- 第一步计算
不带括号的情况:先乘法后除法
- 第一步计算
(94-32)*5m:62*5=310m,这是精确值,没有任何舍入。 - 第二步计算
310m / 9m:结果是无限循环小数34.(4),decimal直接计算到29位有效数字时,第29位是4,后续循环位不会触发进位(银行家舍入法中,末尾是4直接截断),最终得到34.444444444444444444444444444。
- 第一步计算
简单说:带括号时提前做了除法舍入,再用舍入后的值做乘法;不带括号时先做精确乘法,最后一次性做除法舍入,两种路径的舍入节点不同,最终结果就出现了差异。
内容的提问来源于stack exchange,提问作者Cakeslap
相关产品推荐
相关产品推荐

