如何在.Net中将小数舍入到2位小数?

时间:2010-09-26 10:10:37

标签: .net decimal rounding

这应该很简单,但我找不到内置方法,.net框架必须有一个方法来执行此操作!

private decimal RoundDownTo2DecimalPlaces(decimal input)
{
   if (input < 0)
   {
      throw new Exception("not tested with negitive numbers");
   }

   // There must be a better way!
   return Math.Truncate(input * 100) / 100;
}

5 个答案:

答案 0 :(得分:15)

如果您将向下四舍五入,则需要:

Math.Floor(number * 100) / 100;

如果你正在寻找一种叫做“银行家四舍五入”的东西(可能不是用于输出而不是用于统计/求和),那么:

Math.Round(number, 2);

最后如果你想,不确定正确的术语是什么,'正常舍入​​':

Math.Round(number, 2, MidpointRounding.AwayFromZero);

答案 1 :(得分:6)

如果要向下舍入值,请使用Math.Floor;如果要获得精确回合,请使用Math.Round。 Math.Truncate只是删除数字的小数部分,所以你得到负数的坏结果:

var result= Math.Floor(number * 100) / 100;

Math.Floor始终返回比指定值更小(Floor)或更大(Ceiling)的最小整数值。所以你没有得到正确的舍入。例如:

Math.Floor(1.127 * 100) / 100 == 1.12 //should be 1.13 for an exact round
Math.Ceiling(1.121 * 100) / 100 == 1.13 //should be 1.12 for an exact round

始终更喜欢包含中点舍入参数的Math.Round版本。该参数指定如何将中点值(5)作为最后一位数处理。

如果您没有指定AwayFromZero作为param的值,您将获得默认行为,即ToEven。 例如,使用ToEven作为舍入方法,您将获得:

Math.Round(2.025,2)==2.02 
Math.Round(2.035,2)==2.04

相反,使用MidPoint.AwayFromZero param:

Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03
Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04

因此,对于正常的舍入,最好使用此代码:

var value=2.346;
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero);

答案 2 :(得分:3)

使用.Truncate()获取确切金额,或使用.Round()进行四舍五入。

decimal dNum = (decimal)165.6598F;
decimal dTruncated = (decimal)(Math.Truncate((double)dNum*100.0) / 100.0); //Will give 165.65
decimal dRounded = (decimal)(Math.Round((double)dNum, 2)); //Will give 165.66

或者您可以使用扩展方法来运行它,如dNum.ToTwoDecimalPlaces();

public static class Extensions
{ 
    public static decimal ToTwoDecimalPlaces(this decimal dNum)
    {
        return ((decimal)(Math.Truncate((double)dNum*100.0) / 100.0));
    }
}

答案 3 :(得分:2)

Math.Floor(number * 100) / 100;

答案 4 :(得分:0)

.net框架中没有构建方法来执行此操作,其他答案说明如何编写自己的代码。