diff --git a/src/Numerics/Precision.cs b/src/Numerics/Precision.cs index 60106c31..86f858f7 100644 --- a/src/Numerics/Precision.cs +++ b/src/Numerics/Precision.cs @@ -746,147 +746,177 @@ namespace MathNet.Numerics } /// - /// Round to the number closest to 10^powerDigits. - /// - /// Number to be rounded - /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. - /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 - /// Rounded number - public static decimal RoundAboveZero(this decimal number, int powerDigits = 3) - { - if (powerDigits <= 0) - return Math.Round(number, powerDigits*-1,MidpointRounding.AwayFromZero); - return Math.Round(number / (decimal) Math.Pow(10, powerDigits),MidpointRounding.AwayFromZero) * (decimal) Math.Pow(10, powerDigits); - } + /// Round to the number closest to 10^powerDigits. + /// + /// Number to be rounded + /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. + /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 + /// Rounded number + public static double RoundAboveZero(this double number, int powerDigits) + { + if (powerDigits <= 0) + { + return Math.Round(number, -powerDigits, MidpointRounding.AwayFromZero); + } - /// - /// Round to the number closest to 10^powerDigits. + return Math.Round(number / Math.Pow(10, powerDigits), MidpointRounding.AwayFromZero) * Math.Pow(10, powerDigits); + } + + /// + /// Round to the number closest to 10^powerDigits. + /// + /// Number to be rounded + /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. + /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 + /// Rounded number + public static float RoundAboveZero(this float number, int powerDigits) + { + return (float) RoundAboveZero((decimal) number, powerDigits); + } + + /// + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static double RoundAboveZero(this double number, int powerDigits = 3) + public static decimal RoundAboveZero(this decimal number, int powerDigits) { - if (powerDigits <= 0) - return Math.Round(number, powerDigits*-1,MidpointRounding.AwayFromZero); - return Math.Round(number / Math.Pow(10, powerDigits),MidpointRounding.AwayFromZero) * Math.Pow(10, powerDigits); - } + if (powerDigits <= 0) + { + return Math.Round(number, -powerDigits, MidpointRounding.AwayFromZero); + } + + return Math.Round(number / (decimal) Math.Pow(10, powerDigits), MidpointRounding.AwayFromZero) * (decimal) Math.Pow(10, powerDigits); + } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static int RoundAboveZero(this int number, int powerDigits = 3) + public static int RoundAboveZero(this int number, int powerDigits) { - if (powerDigits <= 0) - return number; + if (powerDigits <= 0) + { + return number; + } + return (int) RoundAboveZero((decimal) number, powerDigits); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static uint RoundAboveZero(this uint number, int powerDigits = 3) + [CLSCompliant(false)] + public static uint RoundAboveZero(this uint number, int powerDigits) { if (powerDigits <= 0) + { return number; + } + return (uint) RoundAboveZero((decimal) number, powerDigits); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static ulong RoundAboveZero(this ulong number, int powerDigits = 3) + public static long RoundAboveZero(this long number, int powerDigits) { if (powerDigits <= 0) + { return number; - return (ulong) RoundAboveZero((decimal) number, powerDigits); + } + + return (long) RoundAboveZero((decimal) number, powerDigits); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static long RoundAboveZero(this long number, int powerDigits = 3) + [CLSCompliant(false)] + public static ulong RoundAboveZero(this ulong number, int powerDigits) { if (powerDigits <= 0) + { return number; - return (long) RoundAboveZero((decimal) number, powerDigits); - } + } + return (ulong) RoundAboveZero((decimal) number, powerDigits); + } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static short RoundAboveZero(this short number, int powerDigits = 3) + public static short RoundAboveZero(this short number, int powerDigits) { if (powerDigits <= 0) + { return number; + } + return (short) RoundAboveZero((decimal) number, powerDigits); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static ushort RoundAboveZero(this ushort number, int powerDigits = 3) + [CLSCompliant(false)] + public static ushort RoundAboveZero(this ushort number, int powerDigits) { if (powerDigits <= 0) + { return number; - return (ushort) RoundAboveZero((decimal) number, powerDigits); - } - + } - /// - /// Round to the number closest to 10^powerDigits. - /// - /// Number to be rounded - /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. - /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 - /// Rounded number - public static float RoundAboveZero(this float number, int powerDigits = 3) - { - return (float) RoundAboveZero((decimal) number, powerDigits); + return (ushort) RoundAboveZero((decimal) number, powerDigits); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^powerDigits. /// /// Number to be rounded /// For closest 1000 enter 3, 10^powerDigits. If lower then zero you will get decimal digits. /// To round 123456789 to hundreds RoundAboveZero(123456789, 2) = 123456800 /// Rounded number - public static BigInteger RoundAboveZero(this BigInteger number, int powerDigits = 3) + public static BigInteger RoundAboveZero(this BigInteger number, int powerDigits) { if (powerDigits <= 0) + { return number; + } var onelarger = number / BigInteger.Pow(10, powerDigits-1); var divided = onelarger / 10; var lastDigit = onelarger - divided * 10; if (lastDigit >= 5) + { divided += 1; + } + return divided * BigInteger.Pow(10, powerDigits); }