如果有一个十进制数'96.154',如何确保它始终向上舍入到96.16(而不是正常四舍五入到2位小数,得到96.15)。
这种方法有点像hacky,但非常直观:
var val = 96.154M;
var result = Math.Ceiling(val * 100) / 100.0M;
96.150
时,此方法将无法奏效,因为它会将其四舍五入为96.16
,而这是不正确的,因为它应该是96.15
。 - Steven我认为您正在寻找 Math.Ceiling
方法。
您可以将其与乘数相结合,以指定要舍入的小数位数。像这样,
public float roundUp(float number, int numDecimalPlaces)
{
double multiplier = Math.Pow(10, numDecimalPlaces))
return Math.ceiling(number*multiplier) / multiplier;
}
如果有人在2022年看到这个有点老的问题,使用最新版本的框架/.NET Core来完成这个任务最简单的方法是:
decimal.Round(96.154M, 2, MidpointRounding.ToPositiveInfinity)
这将给出结果96.16。第二个参数是数字的位数。
请注意,如果输入为负数并且您想要四舍五入到最接近的负整数,则需要指定MidpointRounding.ToNegativeInfinity。显然,如果您想要支持两种情况,则可以测试输入值的符号并使用相应的MidpointRounding值。
void Main()
{
Console.WriteLine(RoundUp(2.8448M, 2));
//RoundUp(2.8448M, 2).Dump();
}
public static decimal RoundUp(decimal numero, int numDecimales)
{
decimal valorbase = Convert.ToDecimal(Math.Pow(10, numDecimales));
decimal resultado = Decimal.Round(numero * 1.00000000M, numDecimales + 1, MidpointRounding.AwayFromZero) * valorbase;
decimal valorResiduo = 10M * (resultado - Decimal.Truncate(resultado));
if (valorResiduo < 5)
{
return Decimal.Round(numero * 1.00M, numDecimales, MidpointRounding.AwayFromZero);
}
else
{
var ajuste = Convert.ToDecimal(Math.Pow(10, -(numDecimales + 1)));
numero += ajuste;
return Decimal.Round(numero * 1.00000000M, numDecimales, MidpointRounding.AwayFromZero);
}
}
这里是一个用于对值和基础分数进行四舍五入的方法的代码。你应该在你的问题中使用基础分数0.05M。然而,该方法也可用于其他常见情况,如基础分数为0.5M;你还可以以有趣的方式应用它,例如使用基础分数0.3M。希望这能回答你的问题,玩得开心:
static decimal roundUp(decimal aValue, decimal aBaseFraction)
{
decimal quotient = aValue / aBaseFraction;
decimal roundedQuotient = Math.Round(quotient, 0);
decimal roundAdjust = 0.0M;
if (quotient > roundedQuotient)
{
roundAdjust = aBaseFraction;
}
return roundAdjust + roundedQuotient * aBaseFraction;
}