Re: Problems with Math.Round



Please note, this is new to .NET 2.0.

In .NET 1.1, you need to role your own Round method like in this class:

public sealed class Math {

/// <summary>
/// Rounds the double value to round to a specified number of decimals.
Does not use Bankers Rounding.
/// </summary>
/// <param name="value">The value to round</param>
/// <param name="digits">The number of digits to round to</param>
/// <returns>The rounded value</returns>
public static double Round(double value, int digits) {
return System.Math.Round(value +
(System.Math.Sign(value)/System.Math.Pow(10, digits+1)), digits);
}

/// <summary>
/// Rounds the double value to round to 0 decimals. Does not use Bankers
Rounding.
/// </summary>
/// <param name="value">The value to round</param>
/// <returns>The rounded value</returns>
public static double Round(double value) {
return Round(value, 0);
}

/// <summary>
/// Rounds the decimal value to round to a specified number of decimals.
Does not use Bankers Rounding.
/// </summary>
/// <param name="value">The value to round</param>
/// <param name="digits">The number of digits to round to</param>
/// <returns>The rounded value</returns>
public static decimal Round(decimal value, int digits) {
return System.Math.Round(value + Convert.ToDecimal(
System.Math.Sign(value)/System.Math.Pow(10, digits+1)), digits);
}

/// <summary>
/// Rounds the decimal value to round to 0 decimals. Does not use Bankers
Rounding.
/// </summary>
/// <param name="value">The value to round</param>
/// <returns>The rounded value</returns>
public static decimal Round(decimal value) {
return Round(value, 0);
}

}


"William Stacey [C# MVP]" <william.stacey@xxxxxxxxx> skrev i en meddelelse
news:%23WWWCLGEIHA.2268@xxxxxxxxxxxxxxxxxxxxxxx
This is well treated in the docs. The default is "ToEven" rounding (AKA
Bankers rounding). This tries to prevent rounding errors by always
rounding
in one direction. If the digit is mid-point, and the prior digit is an
even
number, it rounds to even. If the number is odd, then rounds other way.
The
kind of rounding you may have learned in school is always round up to next
digit - or away from zero.

decimal d1 = (decimal)12.985;
decimal d2 = Math.Round(d1, 2, MidpointRounding.ToEven);

decimal d3 = Math.Round(d1, 2, MidpointRounding.AwayFromZero);

decimal d4 = Math.Round((decimal)12.975, 2, MidpointRounding.ToEven);

Console.WriteLine("Value:{0} ToEven:{1} AwayFromZero:{2}
d4:{3}",d1,d2,d3,d4);
// Value:12.985 ToEven:12.98 AwayFromZero:12.99 d4-ToEven:12.98


--
William Stacey [C# MVP]
PowerLocker, PowerPad
www.powerlocker.com




"Rene" <Rene@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:45352A19-2E38-4A84-8524-992B0220BA90@xxxxxxxxxxxxxxxx
| Hello everyone
|
| I have a problem with Math.Round, it´s ocurring some strange:
|
| Math.Round(12.985) = 12.98, it´s wrong. It should be: 12.99
|
| Why?? What is the problem?
|
| Help ME !!!!
|
| Renato




.



Relevant Pages

  • Re: XQ and ->Qpi bug on large X
    ... you shouldn't be rounding to only two digits ... I am trying to make a similar point here about rounding; ... and round it, ... prior to using the input values in calculations. ...
    (comp.sys.hp48)
  • Re: check decimal and if numeric
    ... so effectively truncates an subsequent digits for positive numbers. ... It's different when you round negative numbers down, ... decimals, who's to say the third or fourth digit was the one that was in error? ...
    (microsoft.public.access.formscoding)
  • Re: Decimal
    ... It is even calculating the decimals ... You can see that by clicking on a cell you entered data in and looking at the formula bar... ... You can truncate off any decimal value as if they were never typed in by the user in the first place, or you can round off the typed in value, but then there are two ways to do rounding in a macro, so you have to make sure you specify the right one. ...
    (microsoft.public.excel.misc)
  • Re: Rounding a number to nearest even
    ... That's exactly how I was taught to do rounding in what-ever low-level ... If you round towards an even number instead when the ... and the average rounding error will be 0. ... the nearest whole or half SEK, which means that decimals 25 and 75 are ...
    (comp.lang.python)
  • Re: Decimall Float Question
    ... the number other than to round the decimal part. ... 'bankers rounding' to the nearest even number is not required). ... the FAQ code includes having a variable number of digits after ... // Convert number to string and split ... ...
    (comp.lang.javascript)