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
相关产品推荐
相关产品推荐

