gpt4 book ai didi

c# - Math.Round 方法,从最小的小数开始

转载 作者:太空狗 更新时间:2023-10-29 20:25:49 26 4
gpt4 key购买 nike

由于 Math.Round 工作方式的困惑,已经有很多话题开始了。在大多数情况下,这些问题是通过让人们了解 MidpointRounding 参数来回答的,而且大多数人都期待 MidpointRounding.AwayFromZero。我还有一个关于 AwayFromZero 实现的实际算法的问题。

给定以下数字(多项计算的结果):13.398749999999999999999999999M

我们的用户希望看到与 Excel 相同的结果 13.39875。由于他们目前使用 Math.Round(num, 4, MidpointRounding.AwayFromZero) 将该数字四舍五入为 4,因此结果与他们的预期相差 .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 或其他) .考虑到每个人都有不同的精度水平,我陷入了中间的问题,问题是转向较低的精度、一些奇怪的舍入规则(如上所述),或者只是得到与用户预期不同的结果。

最佳答案

如果我没听错,人们期望的是 13.3988,因为他们首先四舍五入到 13.39875,然后四舍五入到 13.3988,他们需要您与它保持错误兼容。

如果是这样,则无需重复任何四舍五入步骤,因为他们方法中的缺陷仅出现在四舍五入的最后一步(从本质上讲,四舍五入消除了前两步步骤的重要性).

private static decimal InaccurateRound(decimal num, int precision)
{
return Math.Round(
Math.Round(num, precision + 1, MidpointRounding.AwayFromZero),
precision, MidpointRounding.AwayFromZero);
}

关于c# - Math.Round 方法,从最小的小数开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3584535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com