11

This should be easy, but I can’t find a built in method for it, the .net framework must have a method to do this!

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;
}
Ian Ringrose
  • 50,487
  • 53
  • 210
  • 311

5 Answers5

21

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, not sure what the correct term is, 'normal rounding':

Math.Round(number, 2, MidpointRounding.AwayFromZero);
FinnNk
  • 3,229
  • 22
  • 24
  • Look at my response below: MidpointRounding.AwayFromZero or MidpointRounding.ToEven specify how to handle numbers ending with '5': the MidpointRounding.ToEven specify that 1.135 should be round to 1.13, and 1.145 to 1.15 the MidpointRounding.AwayFromZero specify that 1.135 should be round to 1.14, and 1.145 to 1.15 – Andrea Parodi Sep 26 '10 at 10:56
6

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

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

Math.Floor always return 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 param. This param specify how to handle mid-point values (5) as last digit.

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

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

instead, using MidPoint.AwayFromZero param:

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);
Andrea Parodi
  • 5,353
  • 25
  • 45
3
Math.Floor(number * 100) / 100;
Itay Karo
  • 17,370
  • 4
  • 38
  • 56
  • butter then my solution, as Math.Floor give the correct result with negitive numbers. see http://stackoverflow.com/questions/14/whats-the-difference-between-math-floor-and-math-truncate-in-net – Ian Ringrose Sep 26 '10 at 10:27
3

Use .Truncate() to get 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));
    }
}
KMån
  • 9,804
  • 2
  • 30
  • 41
0

There is no build in method in the .net framework to do this, other answers say how to write your own code.

Ian Ringrose
  • 50,487
  • 53
  • 210
  • 311