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

C#计算结果出现额外小数位问题求助

问题原因及解决办法

你的计算逻辑的数学目标是对的,但因为两个细节导致了非预期结果:

1. 十进制浮点的精度限制

bal / totAmount 即10/15=2/3,这是一个无限循环的十进制分数,decimal类型无法精确存储这个值,实际存储的是一个略大于2/3的近似值。后续乘以3后,结果会略大于2.0,再乘以100后变成略大于200的数,Math.Ceiling会将其向上取整为201,最终得到2.01。

2. 字面量类型错误

原代码中没有给数值字面量加m后缀(比如10.0000),导致这些值先以double类型存储(二进制浮点的精度误差更显著),再转换为decimal,进一步放大了中间计算的误差。

修正方案

  • 给decimal字面量加上m后缀,确保直接以decimal类型初始化;
  • 调整计算顺序,先做乘法再做除法,避免出现无法精确表示的中间值:
decimal bal = 10.0000m;
decimal totAmount = 15.0000m;
decimal payAmount = 3m;

// 先计算 bal * payAmount,再除以 totAmount,得到精确的2.0
decimal tempAmount = Math.Ceiling((bal * payAmount / totAmount) * 100);
tempAmount = tempAmount / 100;
// 此时 tempAmount 结果为 2.00

调整后,bal * payAmount = 30,30除以15正好是2.0,是decimal可以精确表示的值,后续计算不会出现误差,最终得到预期的2.00。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:30:45