NUMBERS-43: Remove "round(float)". See discussion on the JIRA page: https://issues.apache.org/jira/browse/NUMBERS-43
Project: http://git-wip-us.apache.org/repos/asf/commons-numbers/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-numbers/commit/bf05e066 Tree: http://git-wip-us.apache.org/repos/asf/commons-numbers/tree/bf05e066 Diff: http://git-wip-us.apache.org/repos/asf/commons-numbers/diff/bf05e066 Branch: refs/heads/feature__NUMBERS-51__field Commit: bf05e066c816245609e0315b27103192906b2d17 Parents: 4b955ca Author: Gilles Sadowski <gil...@harfang.homelinux.org> Authored: Sat Jan 27 17:31:11 2018 +0100 Committer: Gilles Sadowski <gil...@harfang.homelinux.org> Committed: Sat Jan 27 17:31:11 2018 +0100 ---------------------------------------------------------------------- .../apache/commons/numbers/core/Precision.java | 117 ------------------- .../commons/numbers/core/PrecisionTest.java | 107 ----------------- 2 files changed, 224 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/bf05e066/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/Precision.java ---------------------------------------------------------------------- diff --git a/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/Precision.java b/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/Precision.java index e71e1e4..11fe704 100644 --- a/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/Precision.java +++ b/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/Precision.java @@ -461,123 +461,6 @@ public class Precision { } /** - * Rounds the given value to the specified number of decimal places. - * The value is rounded using the {@link BigDecimal#ROUND_HALF_UP} method. - * - * @param x Value to round. - * @param scale Number of digits to the right of the decimal point. - * @return the rounded value. - */ - public static float round(float x, int scale) { - return round(x, scale, BigDecimal.ROUND_HALF_UP); - } - - /** - * Rounds the given value to the specified number of decimal places. - * The value is rounded using the given method which is any method defined - * in {@link BigDecimal}. - * - * @param x Value to round. - * @param scale Number of digits to the right of the decimal point. - * @param roundingMethod Rounding method as defined in {@link BigDecimal}. - * @return the rounded value. - * @throws ArithmeticException if an exact operation is required but result is not exact - * @throws IllegalArgumentException if {@code roundingMethod} is not a valid rounding method. - */ - public static float round(float x, int scale, int roundingMethod) { - final float sign = Math.copySign(1f, x); - final float factor = (float) Math.pow(10.0f, scale) * sign; - return (float) roundUnscaled(x * factor, sign, roundingMethod) / factor; - } - - /** - * Rounds the given non-negative value to the "nearest" integer. Nearest is - * determined by the rounding method specified. Rounding methods are defined - * in {@link BigDecimal}. - * - * @param unscaled Value to round. - * @param sign Sign of the original, scaled value. - * @param roundingMethod Rounding method, as defined in {@link BigDecimal}. - * @return the rounded value. - * @throws ArithmeticException if an exact operation is required but result is not exact - * @throws IllegalArgumentException if {@code roundingMethod} is not a valid rounding method. - */ - private static double roundUnscaled(double unscaled, - double sign, - int roundingMethod) { - switch (roundingMethod) { - case BigDecimal.ROUND_CEILING : - if (sign == -1) { - unscaled = Math.floor(Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY)); - } else { - unscaled = Math.ceil(Math.nextAfter(unscaled, Double.POSITIVE_INFINITY)); - } - break; - case BigDecimal.ROUND_DOWN : - unscaled = Math.floor(Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY)); - break; - case BigDecimal.ROUND_FLOOR : - if (sign == -1) { - unscaled = Math.ceil(Math.nextAfter(unscaled, Double.POSITIVE_INFINITY)); - } else { - unscaled = Math.floor(Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY)); - } - break; - case BigDecimal.ROUND_HALF_DOWN : { - unscaled = Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY); - double fraction = unscaled - Math.floor(unscaled); - if (fraction > 0.5) { - unscaled = Math.ceil(unscaled); - } else { - unscaled = Math.floor(unscaled); - } - break; - } - case BigDecimal.ROUND_HALF_EVEN : { - double fraction = unscaled - Math.floor(unscaled); - if (fraction > 0.5) { - unscaled = Math.ceil(unscaled); - } else if (fraction < 0.5) { - unscaled = Math.floor(unscaled); - } else { - // The following equality test is intentional and needed for rounding purposes - if (Math.floor(unscaled) / 2.0 == Math.floor(Math.floor(unscaled) / 2.0)) { // even - unscaled = Math.floor(unscaled); - } else { // odd - unscaled = Math.ceil(unscaled); - } - } - break; - } - case BigDecimal.ROUND_HALF_UP : { - unscaled = Math.nextAfter(unscaled, Double.POSITIVE_INFINITY); - double fraction = unscaled - Math.floor(unscaled); - if (fraction >= 0.5) { - unscaled = Math.ceil(unscaled); - } else { - unscaled = Math.floor(unscaled); - } - break; - } - case BigDecimal.ROUND_UNNECESSARY : - if (unscaled != Math.floor(unscaled)) { - throw new ArithmeticException(); - } - break; - case BigDecimal.ROUND_UP : - // do not round if the discarded fraction is equal to zero - if (unscaled != Math.floor(unscaled)) { - unscaled = Math.ceil(Math.nextAfter(unscaled, Double.POSITIVE_INFINITY)); - } - break; - default : - throw new IllegalArgumentException("Unhandled rounding method: " + roundingMethod); - } - return unscaled; - } - - - /** * Computes a number {@code delta} close to {@code originalDelta} with * the property that <pre><code> * x + delta - x http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/bf05e066/commons-numbers-core/src/test/java/org/apache/commons/numbers/core/PrecisionTest.java ---------------------------------------------------------------------- diff --git a/commons-numbers-core/src/test/java/org/apache/commons/numbers/core/PrecisionTest.java b/commons-numbers-core/src/test/java/org/apache/commons/numbers/core/PrecisionTest.java index 188c949..8d63c43 100644 --- a/commons-numbers-core/src/test/java/org/apache/commons/numbers/core/PrecisionTest.java +++ b/commons-numbers-core/src/test/java/org/apache/commons/numbers/core/PrecisionTest.java @@ -394,113 +394,6 @@ public class PrecisionTest { Assert.assertEquals("-0.0", Double.toString(Precision.round(-1e-10, 0))); } - @Test - public void testRoundFloat() { - float x = 1.234567890f; - Assert.assertEquals(1.23f, Precision.round(x, 2), 0.0); - Assert.assertEquals(1.235f, Precision.round(x, 3), 0.0); - Assert.assertEquals(1.2346f, Precision.round(x, 4), 0.0); - - // BZ 35904 - Assert.assertEquals(30.1f, Precision.round(30.095f, 2), 0.0f); - Assert.assertEquals(30.1f, Precision.round(30.095f, 1), 0.0f); - Assert.assertEquals(50.09f, Precision.round(50.085f, 2), 0.0f); - Assert.assertEquals(50.19f, Precision.round(50.185f, 2), 0.0f); - Assert.assertEquals(50.01f, Precision.round(50.005f, 2), 0.0f); - Assert.assertEquals(30.01f, Precision.round(30.005f, 2), 0.0f); - Assert.assertEquals(30.65f, Precision.round(30.645f, 2), 0.0f); - - Assert.assertEquals(1.24f, Precision.round(x, 2, BigDecimal.ROUND_CEILING), 0.0); - Assert.assertEquals(1.235f, Precision.round(x, 3, BigDecimal.ROUND_CEILING), 0.0); - Assert.assertEquals(1.2346f, Precision.round(x, 4, BigDecimal.ROUND_CEILING), 0.0); - Assert.assertEquals(-1.23f, Precision.round(-x, 2, BigDecimal.ROUND_CEILING), 0.0); - Assert.assertEquals(-1.234f, Precision.round(-x, 3, BigDecimal.ROUND_CEILING), 0.0); - Assert.assertEquals(-1.2345f, Precision.round(-x, 4, BigDecimal.ROUND_CEILING), 0.0); - - Assert.assertEquals(1.23f, Precision.round(x, 2, BigDecimal.ROUND_DOWN), 0.0); - Assert.assertEquals(1.234f, Precision.round(x, 3, BigDecimal.ROUND_DOWN), 0.0); - Assert.assertEquals(1.2345f, Precision.round(x, 4, BigDecimal.ROUND_DOWN), 0.0); - Assert.assertEquals(-1.23f, Precision.round(-x, 2, BigDecimal.ROUND_DOWN), 0.0); - Assert.assertEquals(-1.234f, Precision.round(-x, 3, BigDecimal.ROUND_DOWN), 0.0); - Assert.assertEquals(-1.2345f, Precision.round(-x, 4, BigDecimal.ROUND_DOWN), 0.0); - - Assert.assertEquals(1.23f, Precision.round(x, 2, BigDecimal.ROUND_FLOOR), 0.0); - Assert.assertEquals(1.234f, Precision.round(x, 3, BigDecimal.ROUND_FLOOR), 0.0); - Assert.assertEquals(1.2345f, Precision.round(x, 4, BigDecimal.ROUND_FLOOR), 0.0); - Assert.assertEquals(-1.24f, Precision.round(-x, 2, BigDecimal.ROUND_FLOOR), 0.0); - Assert.assertEquals(-1.235f, Precision.round(-x, 3, BigDecimal.ROUND_FLOOR), 0.0); - Assert.assertEquals(-1.2346f, Precision.round(-x, 4, BigDecimal.ROUND_FLOOR), 0.0); - - Assert.assertEquals(1.23f, Precision.round(x, 2, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(1.235f, Precision.round(x, 3, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(1.2346f, Precision.round(x, 4, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(-1.23f, Precision.round(-x, 2, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(-1.235f, Precision.round(-x, 3, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(-1.2346f, Precision.round(-x, 4, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(1.234f, Precision.round(1.2345f, 3, BigDecimal.ROUND_HALF_DOWN), 0.0); - Assert.assertEquals(-1.234f, Precision.round(-1.2345f, 3, BigDecimal.ROUND_HALF_DOWN), 0.0); - - Assert.assertEquals(1.23f, Precision.round(x, 2, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(1.235f, Precision.round(x, 3, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(1.2346f, Precision.round(x, 4, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(-1.23f, Precision.round(-x, 2, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(-1.235f, Precision.round(-x, 3, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(-1.2346f, Precision.round(-x, 4, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(1.234f, Precision.round(1.2345f, 3, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(-1.234f, Precision.round(-1.2345f, 3, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(1.236f, Precision.round(1.2355f, 3, BigDecimal.ROUND_HALF_EVEN), 0.0); - Assert.assertEquals(-1.236f, Precision.round(-1.2355f, 3, BigDecimal.ROUND_HALF_EVEN), 0.0); - - Assert.assertEquals(1.23f, Precision.round(x, 2, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(1.235f, Precision.round(x, 3, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(1.2346f, Precision.round(x, 4, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(-1.23f, Precision.round(-x, 2, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(-1.235f, Precision.round(-x, 3, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(-1.2346f, Precision.round(-x, 4, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(1.235f, Precision.round(1.2345f, 3, BigDecimal.ROUND_HALF_UP), 0.0); - Assert.assertEquals(-1.235f, Precision.round(-1.2345f, 3, BigDecimal.ROUND_HALF_UP), 0.0); - - Assert.assertEquals(-1.23f, Precision.round(-1.23f, 2, BigDecimal.ROUND_UNNECESSARY), 0.0); - Assert.assertEquals(1.23f, Precision.round(1.23f, 2, BigDecimal.ROUND_UNNECESSARY), 0.0); - - try { - Precision.round(1.234f, 2, BigDecimal.ROUND_UNNECESSARY); - Assert.fail(); - } catch (ArithmeticException ex) { - // success - } - - Assert.assertEquals(1.24f, Precision.round(x, 2, BigDecimal.ROUND_UP), 0.0); - Assert.assertEquals(1.235f, Precision.round(x, 3, BigDecimal.ROUND_UP), 0.0); - Assert.assertEquals(1.2346f, Precision.round(x, 4, BigDecimal.ROUND_UP), 0.0); - Assert.assertEquals(-1.24f, Precision.round(-x, 2, BigDecimal.ROUND_UP), 0.0); - Assert.assertEquals(-1.235f, Precision.round(-x, 3, BigDecimal.ROUND_UP), 0.0); - Assert.assertEquals(-1.2346f, Precision.round(-x, 4, BigDecimal.ROUND_UP), 0.0); - - try { - Precision.round(1.234f, 2, 1923); - Assert.fail(); - } catch (IllegalArgumentException ex) { - // success - } - - // special values - TestUtils.assertEquals(Float.NaN, Precision.round(Float.NaN, 2), 0.0f); - Assert.assertEquals(0.0f, Precision.round(0.0f, 2), 0.0f); - Assert.assertEquals(Float.POSITIVE_INFINITY, Precision.round(Float.POSITIVE_INFINITY, 2), 0.0f); - Assert.assertEquals(Float.NEGATIVE_INFINITY, Precision.round(Float.NEGATIVE_INFINITY, 2), 0.0f); - // comparison of positive and negative zero is not possible -> always equal thus do string comparison - Assert.assertEquals("-0.0", Float.toString(Precision.round(-0.0f, 0))); - Assert.assertEquals("-0.0", Float.toString(Precision.round(-1e-10f, 0))); - - // MATH-1070 - Assert.assertEquals(0.0f, Precision.round(0f, 2, BigDecimal.ROUND_UP), 0.0f); - Assert.assertEquals(0.05f, Precision.round(0.05f, 2, BigDecimal.ROUND_UP), 0.0f); - Assert.assertEquals(0.06f, Precision.round(0.051f, 2, BigDecimal.ROUND_UP), 0.0f); - Assert.assertEquals(0.06f, Precision.round(0.0505f, 2, BigDecimal.ROUND_UP), 0.0f); - Assert.assertEquals(0.06f, Precision.round(0.059f, 2, BigDecimal.ROUND_UP), 0.0f); - } - @Test public void testIssue721() {