例如:
四舍五入为十分之一:
0.44 -> 0.4
0.45 -> 0.5
四舍五入为整数:
0.44 -> 0.0 0.45 -> 1.0
标准方法不适合:
-- T-SQL print round(0.44, 1) ---> 0.40 Nice print round(0.45, 1) ---> 0.50 Nice print round(0.44, 0) ---> 0.00 Nice print round(0.45, 0) ---> 0.00 Bad (need 1.00) // C# Console.WriteLine(Math.Round(0.44m, 1, MidpointRounding.AwayFromZero)); //-> 0.40 Nice Console.WriteLine(Math.Round(0.45m, 1, MidpointRounding.AwayFromZero)); //-> 0.50 Nice Console.WriteLine(Math.Round(0.44m, 0, MidpointRounding.AwayFromZero)); //-> 0.00 Nice Console.WriteLine(Math.Round(0.45m, 0, MidpointRounding.AwayFromZero)); //-> 0.00 Bad (need 1.00)
[以前,我相信round
(T-SQL)和Math.Round
(C#)可以根据需要工作。但不是。奇怪,但网上几乎没有有关该主题的信息。Summary:应将每个数字的值逐步取整为0.45(和类似的值,例如0.44445),并得出1:
0.45 -> 0.50 -> 1.00.
四舍五入的整数部分并不总是为0。也许是1.2.3 ... 100。是否有任何具有这种行为的标准C#和T-SQL函数?
实现此目的的最佳方法是什么?
更新
为什么需要这个?
我的客户使用许多需要四舍五入的指标。每个指示器都显示用户工作的成功。所描述的方法将改善这些指标。改进将使客户和用户都受益。因此,将考虑此舍入选项。我同意四舍五入在数学上是不正确的观点。由于0.45和0.5的四舍五入都以显式形式出现在程序中,这使我犯了一个错误。 C#和T-SQL函数正常工作。
9 / 8
乘以[[乘]] round(0.45, 1) -> round(0.45 * 9 / 8, 1) -- T-SQL
Math.Round(0.45m, ...) -> Math.Round(0.45m * 9 / 8, ...) // C#
C#代码
Func<double, int, double> round = (value, digits) =>
Math.Round(value * 9 / 8, digits, MidpointRounding.AwayFromZero);
Demo:
double[] tests = new double[] {
0.44,
0.45,
};
string result = string.Join(Environment.NewLine, tests
.Select(test => $"{test} => {round(test, 1)}")
.Concat(tests
.Select(test => $"{test} => {round(test, 0)}")));
Console.Write(result);
结果:
0.44 => 0.5
0.45 => 0.5
0.44 => 0
0.45 => 1