有很多帖子讨论了
给定以下数字(许多计算的结果):
所以问题是...是否有一种方法来模拟这种行为而不是当前的行为?
我编写了一个递归函数,我们可以在此期间使用它。但是,在我们投入生产之前,我想知道 SO 对这个问题的看法 :-)
Math.Round
的工作方式存在的混淆。大多数情况下,这些问题都可以通过向人们提示 MidpointRounding
参数并且大多数人都期望 MidpointRounding.AwayFromZero
来解决。但是我对 AwayFromZero 实际实现的算法有进一步的问题。给定以下数字(许多计算的结果):
13.398749999999999999999999999M
我们的用户期望看到与 Excel 相同的结果 13.39875
。由于他们目前使用 Math.Round(num,4,MidpointRounding.AwayFromZero)将该数字四舍五入,因此结果与他们期望的差0.0001。可能的原因是算法只查看第五个数字(4),然后进行相应的舍入。如果您从最后一个9开始四舍五入,则真正的数学答案实际上会给您提供与 excel 相同的数字。所以问题是...是否有一种方法来模拟这种行为而不是当前的行为?
我编写了一个递归函数,我们可以在此期间使用它。但是,在我们投入生产之前,我想知道 SO 对这个问题的看法 :-)
private decimal Round(decimal num, int precision)
{
return Round(num, precision, 28);
}
private decimal Round(decimal num, int precision, int fullPrecision)
{
if (precision >= fullPrecision) return Math.Round(num, precision);
return Round(Math.Round(num, fullPrecision), precision, --fullPrecision);
}
编辑:为了明确起见,我在原帖中应该更清楚。这里被要求的舍入方法是由业务分析师和用户报告“舍入误差”所提出的。尽管已经多次告诉他们这不是错误,只是与他们期望的不同...这个报告仍然在出现。因此,我只是在进行数据收集,以在这个话题上收集尽可能多的信息,向用户汇报。
在这种情况下,似乎任何其他用于生成这些平均价格的系统(我们必须匹配)都使用不同级别的精度(数据库中为10,而Excel似乎默认为15或其他)。鉴于每个人都有不同的精度水平,我陷入了困境,需要考虑降低精度、采用一些奇怪的舍入规则(如上所述),或者只是得到与用户期望不同的结果。