如何将小数向上取整?

17

如果有一个十进制数'96.154',如何确保它始终向上舍入到96.16(而不是正常四舍五入到2位小数,得到96.15)。


96.154如何向上舍入为96.16而不是向下舍入为96.15?详细说明舍入应该如何工作将会很有帮助。 - Russ Cam
请查看此链接:https://dev59.com/qGbWa4cB1Zd3GeqPZ716#11741129 - sabz23
这是实际的十进制类型还是双精度类型? - ken2k
3
你在意负数吗?它们也应该像正数一样向零舍入吗? - Michael Graczyk
6个回答

19

这种方法有点像hacky,但非常直观:

var val = 96.154M;

var result = Math.Ceiling(val * 100) / 100.0M;

虽然不是最理想的选择,但看起来是最好的解决方案。 - Adam Goss

7
您可以将0.005加到该值上,然后四舍五入结果。

1
天才,但这取决于你是否总是想要远离零四舍五入,那么负数呢? - Jodrell
@Jodrell 这个问题的标题就是“始终在线”。顺便说一下,我赞同有关负数的评论。 - Bruno Ferreira
4
当数值为96.150时,此方法将无法奏效,因为它会将其四舍五入为96.16,而这是不正确的,因为它应该是96.15 - Steven

6

我认为您正在寻找 Math.Ceiling 方法。

您可以将其与乘数相结合,以指定要舍入的小数位数。像这样,

public float roundUp(float number, int numDecimalPlaces)
{
    double multiplier = Math.Pow(10, numDecimalPlaces))

    return Math.ceiling(number*multiplier) / multiplier;
}

1

如果有人在2022年看到这个有点老的问题,使用最新版本的框架/.NET Core来完成这个任务最简单的方法是:

decimal.Round(96.154M, 2, MidpointRounding.ToPositiveInfinity)

这将给出结果96.16。第二个参数是数字的位数。

请注意,如果输入为负数并且您想要四舍五入到最接近的负整数,则需要指定MidpointRounding.ToNegativeInfinity。显然,如果您想要支持两种情况,则可以测试输入值的符号并使用相应的MidpointRounding值。


0
这是我的一个 RoundUp 方法版本,在其中可以指定小数位数。
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

这里是一个用于对值和基础分数进行四舍五入的方法的代码。你应该在你的问题中使用基础分数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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接