开发者

How do I round down a decimal to two decimal places in .NET?

开发者 https://www.devze.com 2023-01-17 10:14 出处:网络
Is there a built-in method for it? The .NET framework must have a method to do this! private decimal RoundDownTo2DecimalPlaces(decimal input)

Is there a built-in method for it? The .NET framework must have a method to do this!

private decimal RoundDownTo2DecimalPlaces(decimal input)
{
   开发者_如何学Goif (input < 0)
   {
      throw new Exception("not tested with negative numbers");
   }

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


If you are rounding down then you need:

Math.Floor(number * 100) / 100;

If you are looking for something called bankers' rounding (probably not if it's for output and not for statistics/summing) then:

Math.Round(number, 2);

Finally, if you want—I am not sure what the correct term is—'normal rounding':

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


Use Math.Floor if you want to round down the value, or Math.Round if you want to get an exact round. Math.Truncate simply removes the decimal part of the number, so you get bad results for negative numbers:

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

Math.Floor always returns the smallest integral value that is lesser (floor) or greater (ceiling) than the specified value. So you don't get a correct rounding. Example:

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

Always prefer the version of Math.Round containing the mid-point rounding parameter. This parameter specifies how to handle mid-point values (5) as the last digit.

If you don't specify AwayFromZero as the value for the parameter, you'll get the default behaviour, which is ToEven. For example, using ToEven as the rounding method, you get:

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

Instead, using the MidPoint.AwayFromZero parameter:

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

So, for a normal rounding, it's best to use this code:

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


Math.Floor(number * 100) / 100;


Use .Truncate() to get the exact amount, or .Round() to round off.

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

Or you can make an extension method to run it like dNum.ToTwoDecimalPlaces();

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


There isn't any built-in method in the .NET framework to do this. Other answers say how to write your own code.

0

精彩评论

暂无评论...
验证码 换一张
取 消