【发布时间】:2010-09-23 15:00:57
【问题描述】:
根据文档,decimal.Round 方法使用对大多数应用程序不常见的舍入到偶数算法。所以我总是最终编写一个自定义函数来执行更自然的取整算法:
public static decimal RoundHalfUp(this decimal d, int decimals)
{
if (decimals < 0)
{
throw new ArgumentException("The decimals must be non-negative",
"decimals");
}
decimal multiplier = (decimal)Math.Pow(10, decimals);
decimal number = d * multiplier;
if (decimal.Truncate(number) < number)
{
number += 0.5m;
}
return decimal.Round(number) / multiplier;
}
有人知道这个框架设计决策背后的原因吗?
框架中是否有任何内置的半舍入算法实现?或者可能是一些非托管的 Windows API?
对于简单地写 decimal.Round(2.5m, 0) 期望结果为 3 但得到 2 的初学者来说,这可能会产生误导。
【问题讨论】:
-
四舍五入并不是“更自然”。自然与它无关。这只是你在小学学习“四舍五入”概念时学到的东西。小学课程并不总是描绘完整的画面。
-
@Rob 这就是为什么它更自然,即使它不正确
-
我不明白,@Pacerier。我解释了为什么它不自然,而你说这实际上就是它是自然的原因。我的论点如何反对我的结论,这与你的相反?您已经习惯的事情可能感觉自然,有时我们比喻说某事是“第二天性”,但这并不能使它们自然。
-
@Rob 我说这很自然,因为感觉很自然。你知道有 36 个不同的对象具有相同的变量名 natural 对吗?
-
自然是绝对相似的,所以用错词了;但这是迂腐的。也许“通常”会是一个更好的词......“人们通常做的四舍五入是什么”> 0.5 到 1.0