1 out of 4 rated this helpful Rate this topic

Math.Round Method (Decimal)

Rounds a decimal value to the nearest integral value.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)
public static decimal Round(
	decimal d
)

Parameters

d
Type: System.Decimal
A decimal number to be rounded.

Return Value

Type: System.Decimal
The integer nearest parameter d. If the fractional component of d is halfway between two integers, one of which is even and the other odd, the even number is returned. Note that this method returns a Decimal instead of an integral type.
Exception Condition
OverflowException

The result is outside the range of a Decimal.

The behavior of this method follows IEEE Standard 754, section 4. This kind of rounding is sometimes called rounding to nearest, or banker's rounding. It minimizes rounding errors that result from consistently rounding a midpoint value in a single direction.

To control the type of rounding used by the Round(Decimal) method, call the Math.Round(Decimal, MidpointRounding) overload.

The following example demonstrates rounding to nearest.


using System;

class Program
{
    static void Main()
    {
    Console.WriteLine("Classic Math.Round in CSharp");
    Console.WriteLine(Math.Round(4.4)); // 4
    Console.WriteLine(Math.Round(4.5)); // 4
    Console.WriteLine(Math.Round(4.6)); // 5
    Console.WriteLine(Math.Round(5.5)); // 6
    }
}


.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Portable Class Library

Supported in: Portable Class Library

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
error

4.5 doesn't round to 4 but to 5

Possible Rounding Error

I can't reproduce this behavior when declaring a literal value of 4.5. Do you have any code that illustrates the problem?

Note that the above code example actually illustrates the Math.Round(Double) rather than the Math.Round(Decimal) overload. (We'll replace the example in the next documentation refresh, which is currently scheduled for some time in February 2012.) The difference is significant. Although all non-integral values are subject to a loss of precision, the Double data type is more prone to a loss of precision than the Decimal data type. In the case of these types, rounding error appears to occur when the visible value of a fractional number is less than or greater than its actual displayed value. In this case, the Math.Round method may not appear to use banker's rounding. The example in the Notes to Callers section at http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx illustrates the problem. To determine the "real" value of a fractional number, call its ToString(String) method with the "R" standard numeric format string.

--Ron Petrusha
Common Language Runtime User Education
Microsoft Corporation