diff --git a/src/Numerics.Tests/PrecisionTest.cs b/src/Numerics.Tests/PrecisionTest.cs index e5f18611..e151a4c7 100644 --- a/src/Numerics.Tests/PrecisionTest.cs +++ b/src/Numerics.Tests/PrecisionTest.cs @@ -1159,98 +1159,98 @@ namespace MathNet.Numerics.UnitTests } [Test] - [TestCase(100.3123, 3, 0)] - [TestCase(1100.6123, 3, 1000)] - [TestCase(1500.8123, 3, 2000)] - [TestCase(110003245.3123, 3, 110003000)] - [TestCase(110003245.3123, 1, 110003250)] - [TestCase(110003245.3123, -2, 110003245.31)] + [TestCase(100.3123, -3, 0)] + [TestCase(1100.6123, -3, 1000)] + [TestCase(1500.8123, -3, 2000)] + [TestCase(110003245.3123, -3, 110003000)] + [TestCase(110003245.3123, -1, 110003250)] + [TestCase(110003245.3123, 2, 110003245.31)] [TestCase(110003245.3123, 0, 110003245)] - public void RoundAboveDecimal(decimal number, int digit, decimal expectedResult) + public void RoundDecimal(decimal number, int digit, decimal expectedResult) { - Assert.AreEqual(expectedResult, number.RoundAboveZero(digit)); + Assert.AreEqual(expectedResult, number.Round(digit)); } [Test] - [TestCase(100.3123, 3, 0)] - [TestCase(1100.6123, 3, 1000)] - [TestCase(1500.8123, 3, 2000)] - [TestCase(110003245.3123, 3, 110003000)] - [TestCase(110003245.3123, 1, 110003250)] - [TestCase(110003245.3123, -2, 110003245.31)] + [TestCase(100.3123, -3, 0)] + [TestCase(1100.6123, -3, 1000)] + [TestCase(1500.8123, -3, 2000)] + [TestCase(110003245.3123, -3, 110003000)] + [TestCase(110003245.3123, -1, 110003250)] + [TestCase(110003245.3123, 2, 110003245.31)] [TestCase(110003245.3123, 0, 110003245)] - public void RoundAboveDouble(double number, int digit, double expectedResult) + public void RoundDouble(double number, int digit, double expectedResult) { - Assert.AreEqual(expectedResult,number.RoundAboveZero(digit)); + Assert.AreEqual(expectedResult,number.Round(digit)); } [Test] - [TestCase(100.3123f, 3, 0f)] - [TestCase(1100.6123f, 3, 1000f)] - [TestCase(1500.8123f, 3, 2000f)] - [TestCase(11245.3123f, 3, 11000f)] - [TestCase(13245.3123f, 1, 13250f)] - [TestCase(13245.3123f, -2, 13245.31f)] + [TestCase(100.3123f, -3, 0f)] + [TestCase(1100.6123f, -3, 1000f)] + [TestCase(1500.8123f, -3, 2000f)] + [TestCase(11245.3123f, -3, 11000f)] + [TestCase(13245.3123f, -1, 13250f)] + [TestCase(13245.3123f, 2, 13245.31f)] [TestCase(13245.3123f, 0, 13245f)] - public void RoundAboveFloat(float number, int digit, float expectedResult) + public void RoundSingle(float number, int digit, float expectedResult) { - Assert.AreEqual(expectedResult,number.RoundAboveZero(digit)); + Assert.AreEqual(expectedResult,number.Round(digit)); } [Test] - [TestCase(100, 3, 0)] - [TestCase(1100, 3, 1000)] - [TestCase(1500, 3, 2000)] - [TestCase(110003245, 3, 110003000)] - [TestCase(110003245, 1, 110003250)] - [TestCase(110003245, -2, 110003245)] - public void RoundAboveInt(int number, int digit, int expectedResult) + [TestCase(100, -3, 0)] + [TestCase(1100, -3, 1000)] + [TestCase(1500, -3, 2000)] + [TestCase(110003245, -3, 110003000)] + [TestCase(110003245, -1, 110003250)] + [TestCase(110003245, 2, 110003245)] + public void RoundInt32(int number, int digit, int expectedResult) { - Assert.AreEqual(expectedResult,number.RoundAboveZero(digit)); + Assert.AreEqual(expectedResult,number.Round(digit)); } [Test] - public void RoundAboveUint() + public void RoundUint32() { - Assert.AreEqual(110003250,((uint)110003245).RoundAboveZero(1)); + Assert.AreEqual(110003250,((uint)110003245).Round(-1)); } - + [Test] - public void RoundAboveUlong() + public void RoundUInt64() { - Assert.AreEqual(3250, ((ulong)3245).RoundAboveZero(1)); + Assert.AreEqual(3250, ((ulong)3245).Round(-1)); } [Test] - [TestCase(110003245, 1, 110003250)] - public void RoundAboveLong(long number, int digit, int expectedResult) + [TestCase(110003245, -1, 110003250)] + public void RoundInt64(long number, int digit, int expectedResult) { - Assert.AreEqual(expectedResult, number.RoundAboveZero(digit)); + Assert.AreEqual(expectedResult, number.Round(digit)); } [Test] - public void RoundAboveShort() + public void RoundInt16() { - Assert.AreEqual(3250, ((short)3245).RoundAboveZero(1)); + Assert.AreEqual(3250, ((short)3245).Round(-1)); } [Test] - public void RoundAboveUshort() + public void RoundUInt16() { - Assert.AreEqual(3250,((ushort)3245).RoundAboveZero(1)); + Assert.AreEqual(3250,((ushort)3245).Round(-1)); } [Test] - public void RoundAboveBigInteger() + public void RoundBigInteger() { - Assert.AreEqual(BigInteger.Zero,new BigInteger(100).RoundAboveZero(3)); - Assert.AreEqual(new BigInteger(1000),new BigInteger(1100).RoundAboveZero(3)); - Assert.AreEqual(new BigInteger(2000),new BigInteger(1500).RoundAboveZero(3)); - Assert.AreEqual(new BigInteger(110003000), new BigInteger(110003245).RoundAboveZero(3)); - Assert.AreEqual(new BigInteger(110003250), new BigInteger(110003245).RoundAboveZero(1)); - Assert.AreEqual(new BigInteger(110003245), new BigInteger(110003245).RoundAboveZero(-2)); - Assert.AreEqual(new BigInteger(110003245), new BigInteger(110003245).RoundAboveZero(0)); + Assert.AreEqual(BigInteger.Zero,new BigInteger(100).Round(-3)); + Assert.AreEqual(new BigInteger(1000),new BigInteger(1100).Round(-3)); + Assert.AreEqual(new BigInteger(2000),new BigInteger(1500).Round(-3)); + Assert.AreEqual(new BigInteger(110003000), new BigInteger(110003245).Round(-3)); + Assert.AreEqual(new BigInteger(110003250), new BigInteger(110003245).Round(-1)); + Assert.AreEqual(new BigInteger(110003245), new BigInteger(110003245).Round(2)); + Assert.AreEqual(new BigInteger(110003245), new BigInteger(110003245).Round(0)); } } } diff --git a/src/Numerics/Precision.cs b/src/Numerics/Precision.cs index 86f858f7..122f817f 100644 --- a/src/Numerics/Precision.cs +++ b/src/Numerics/Precision.cs @@ -746,170 +746,171 @@ namespace MathNet.Numerics } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static double RoundAboveZero(this double number, int powerDigits) + public static double Round(this double number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { - return Math.Round(number, -powerDigits, MidpointRounding.AwayFromZero); + return Math.Round(number, decimals, MidpointRounding.AwayFromZero); } - return Math.Round(number / Math.Pow(10, powerDigits), MidpointRounding.AwayFromZero) * Math.Pow(10, powerDigits); + return Math.Round(number / Math.Pow(10, -decimals), MidpointRounding.AwayFromZero) * Math.Pow(10, -decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static float RoundAboveZero(this float number, int powerDigits) + public static float Round(this float number, int decimals) { - return (float) RoundAboveZero((decimal) number, powerDigits); + return (float) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static decimal RoundAboveZero(this decimal number, int powerDigits) + public static decimal Round(this decimal number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { - return Math.Round(number, -powerDigits, MidpointRounding.AwayFromZero); + return Math.Round(number, decimals, MidpointRounding.AwayFromZero); } - return Math.Round(number / (decimal) Math.Pow(10, powerDigits), MidpointRounding.AwayFromZero) * (decimal) Math.Pow(10, powerDigits); + decimal roundTo = (decimal) Math.Pow(10, -decimals); + return Math.Round(number / roundTo, MidpointRounding.AwayFromZero) * roundTo; } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static int RoundAboveZero(this int number, int powerDigits) + public static int Round(this int number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - return (int) RoundAboveZero((decimal) number, powerDigits); + return (int) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number [CLSCompliant(false)] - public static uint RoundAboveZero(this uint number, int powerDigits) + public static uint Round(this uint number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - return (uint) RoundAboveZero((decimal) number, powerDigits); + return (uint) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static long RoundAboveZero(this long number, int powerDigits) + public static long Round(this long number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - return (long) RoundAboveZero((decimal) number, powerDigits); + return (long) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number [CLSCompliant(false)] - public static ulong RoundAboveZero(this ulong number, int powerDigits) + public static ulong Round(this ulong number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - return (ulong) RoundAboveZero((decimal) number, powerDigits); + return (ulong) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static short RoundAboveZero(this short number, int powerDigits) + public static short Round(this short number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - return (short) RoundAboveZero((decimal) number, powerDigits); + return (short) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number [CLSCompliant(false)] - public static ushort RoundAboveZero(this ushort number, int powerDigits) + public static ushort Round(this ushort number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - return (ushort) RoundAboveZero((decimal) number, powerDigits); + return (ushort) Round((decimal) number, decimals); } /// - /// Round to the number closest to 10^powerDigits. + /// Round to the number closest to 10^(-decimals). Supports negative decimals to round within the integer part. /// /// 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 + /// Number of decimals to round to. Negative to round within the integer part, e.g. -3 will wound to the closes 1000. + /// To round 123456789 to hundreds Round(123456789, -2) = 123456800 /// Rounded number - public static BigInteger RoundAboveZero(this BigInteger number, int powerDigits) + public static BigInteger Round(this BigInteger number, int decimals) { - if (powerDigits <= 0) + if (decimals >= 0) { return number; } - var onelarger = number / BigInteger.Pow(10, powerDigits-1); + var onelarger = number / BigInteger.Pow(10, (-decimals)-1); var divided = onelarger / 10; var lastDigit = onelarger - divided * 10; if (lastDigit >= 5) @@ -917,7 +918,7 @@ namespace MathNet.Numerics divided += 1; } - return divided * BigInteger.Pow(10, powerDigits); + return divided * BigInteger.Pow(10, -decimals); } ///