C#,SQL Server:四舍五入[关闭]

问题描述 投票:0回答:2
我需要在C#和T-SQL中四舍五入十进制类型。四舍五入应考虑数字中的所有数字。

例如:

四舍五入为十分之一:

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函数正常工作。
c# sql-server tsql rounding
2个回答
1
投票
四舍五入前,尝试将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


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.