.NET 和 Compact Framework 默认使用银行家四舍五入,这意味着值:1,165 将四舍五入为:1,16。
相反,sql server 将其四舍五入到 1,17,因为对我来说这是正确的行为。
有没有人遇到过四舍五入的话题并有一个紧凑框架的解决方法?(在 .net 中有一个附加参数会影响舍入行为)
.NET 和 Compact Framework 默认使用银行家四舍五入,这意味着值:1,165 将四舍五入为:1,16。
相反,sql server 将其四舍五入到 1,17,因为对我来说这是正确的行为。
有没有人遇到过四舍五入的话题并有一个紧凑框架的解决方法?(在 .net 中有一个附加参数会影响舍入行为)
Math.Floor(double)似乎得到支持,所以;
private static double RoundToTwo(double value)
{
return Math.Floor(100*value + .5)/100;
}
Console.WriteLine(RoundToTwo(1.165));
> 1.17
Console.WriteLine(RoundToTwo(1.16499));
> 1.16
这是您可以使用的一种方法,而不是 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;
}
这个问题还问为什么.Net 使用银行家四舍五入。所以我相信这对你来说会是一本好书。
回答为什么
这种银行家算法意味着当小数== .5时,收集的结果将均匀分布向上/向下舍入,所以实际上只是为了平衡数据结果。
这是Skeet先生描述的另一个链接
尝试
double number = 1.165;
string RoundedNumber = number.ToString("f3");
其中 3 是比例