Monday, July 18, 2005
Math.Round in .NET
The .NET 1.1 Framework Math.Round function uses an interesting rounding algorithm called "Bankers Rounding". Basically, this means that the numbers are rounded to the nearest even number. So both 5.3 and 5.6 are rounded to the nearest even number, 6. This is different from the rounding algorithm that we applied in elementary school, which is to round up any number that has a fractional element greater than or equal to .50. I'm not sure why they did the rounding this way, but we have to live with it. I did a sample run of some numbers and saw the following when I used Math.Round():
using Math.Round(numbers[i])
====================
774.10 rounded : 774
774.50 rounded : 774
774.99 rounded : 775
775.10 rounded : 775
775.50 rounded : 776
775.99 rounded : 776
775.15 rounded : 775
775.55 rounded : 776
As you can see, 774.50 was rounded to 774 (the nearest whole even number to 774.50).
Apparently, the string.Format() method actually rounds numbers the normal way, as you can tell from this run:
using string.Format("{0:n0}", numbers[i])
=========================================
774.10 rounded : 774
774.50 rounded : 775
774.99 rounded : 775
775.10 rounded : 775
775.50 rounded : 776
775.99 rounded : 776
775.15 rounded : 775
775.55 rounded : 776
Here, all of the numbers with fractional values less than .50 are rounded down to the nearest whole number, while numbers with fractional values greater than .50 are rounded up to the nearest whole number.
Version 2.0 of the framework will provide the ability to specify the type of rounding algorithm to use with the Math.Round() method.
using Math.Round(numbers[i])
====================
774.10 rounded : 774
774.50 rounded : 774
774.99 rounded : 775
775.10 rounded : 775
775.50 rounded : 776
775.99 rounded : 776
775.15 rounded : 775
775.55 rounded : 776
As you can see, 774.50 was rounded to 774 (the nearest whole even number to 774.50).
Apparently, the string.Format() method actually rounds numbers the normal way, as you can tell from this run:
using string.Format("{0:n0}", numbers[i])
=========================================
774.10 rounded : 774
774.50 rounded : 775
774.99 rounded : 775
775.10 rounded : 775
775.50 rounded : 776
775.99 rounded : 776
775.15 rounded : 775
775.55 rounded : 776
Here, all of the numbers with fractional values less than .50 are rounded down to the nearest whole number, while numbers with fractional values greater than .50 are rounded up to the nearest whole number.
Version 2.0 of the framework will provide the ability to specify the type of rounding algorithm to use with the Math.Round() method.