You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位有效数字,运算时遵循银行家舍入法(四舍六入五成双),两种写法的运算顺序不一样,直接影响了舍入发生的节点:

  1. 带括号的情况:先除法后乘法

    • 第一步计算5m / 9m:这是无限循环小数0.(4),decimal无法存储完整的循环值,会先将结果舍入到29位有效数字,得到0.5555555555555555555555555556(第29位是4,后续的循环位触发进位)。
    • 第二步计算(94-32) * 上述结果:62m * 0.5555555555555555555555555556 = 34.4444444444444444444444444472,最终输出时舍入到28位,得到34.444444444444444444444444447。
  2. 不带括号的情况:先乘法后除法

    • 第一步计算(94-32)*5m:62*5=310m,这是精确值,没有任何舍入。
    • 第二步计算310m / 9m:结果是无限循环小数34.(4),decimal直接计算到29位有效数字时,第29位是4,后续循环位不会触发进位(银行家舍入法中,末尾是4直接截断),最终得到34.444444444444444444444444444。

简单说:带括号时提前做了除法舍入,再用舍入后的值做乘法;不带括号时先做精确乘法,最后一次性做除法舍入,两种路径的舍入节点不同,最终结果就出现了差异。

内容的提问来源于stack exchange,提问作者Cakeslap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:42:42