From 6ebe203fc0189c34e89878e2538f23580ddf1282 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Fri, 20 Apr 2012 18:54:47 +0000 Subject: [PATCH] Changed Unit.toString to use 0.### format for pretty small numbers ( 0.0005 < . < 0.095). Modified the unit test to have explicit tests for rounding to the correct value at the correct position (for round to even rule). git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@579 180e2498-e6e9-4542-8430-84ac67f01cd8 --- core/src/net/sf/openrocket/unit/Unit.java | 43 +---- .../sf/openrocket/unit/UnitToStringTest.java | 181 +++++++++++++++--- 2 files changed, 156 insertions(+), 68 deletions(-) diff --git a/core/src/net/sf/openrocket/unit/Unit.java b/core/src/net/sf/openrocket/unit/Unit.java index 4703b31b..dda76944 100644 --- a/core/src/net/sf/openrocket/unit/Unit.java +++ b/core/src/net/sf/openrocket/unit/Unit.java @@ -70,42 +70,6 @@ public abstract class Unit { return true; } - - // Testcases for toString(double) - public static void main(String arg[]) { - System.out.println(NOUNIT2.toString(0.0049)); - System.out.println(NOUNIT2.toString(0.0050)); - System.out.println(NOUNIT2.toString(0.0051)); - System.out.println(NOUNIT2.toString(0.00123)); - System.out.println(NOUNIT2.toString(0.0123)); - System.out.println(NOUNIT2.toString(0.1234)); - System.out.println(NOUNIT2.toString(1.2345)); - System.out.println(NOUNIT2.toString(12.345)); - System.out.println(NOUNIT2.toString(123.456)); - System.out.println(NOUNIT2.toString(1234.5678)); - System.out.println(NOUNIT2.toString(12345.6789)); - System.out.println(NOUNIT2.toString(123456.789)); - System.out.println(NOUNIT2.toString(1234567.89)); - System.out.println(NOUNIT2.toString(12345678.9)); - - System.out.println(NOUNIT2.toString(-0.0049)); - System.out.println(NOUNIT2.toString(-0.0050)); - System.out.println(NOUNIT2.toString(-0.0051)); - System.out.println(NOUNIT2.toString(-0.00123)); - System.out.println(NOUNIT2.toString(-0.0123)); - System.out.println(NOUNIT2.toString(-0.1234)); - System.out.println(NOUNIT2.toString(-1.2345)); - System.out.println(NOUNIT2.toString(-12.345)); - System.out.println(NOUNIT2.toString(-123.456)); - System.out.println(NOUNIT2.toString(-1234.5678)); - System.out.println(NOUNIT2.toString(-12345.6789)); - System.out.println(NOUNIT2.toString(-123456.789)); - System.out.println(NOUNIT2.toString(-1234567.89)); - System.out.println(NOUNIT2.toString(-12345678.9)); - - } - - @Override public String toString() { return unit; @@ -115,6 +79,7 @@ public abstract class Unit { private static final DecimalFormat intFormat = new DecimalFormat("#"); private static final DecimalFormat decFormat = new DecimalFormat("0.##"); + private static final DecimalFormat smallFormat = new DecimalFormat("0.###"); private static final DecimalFormat expFormat = new DecimalFormat("0.00E0"); /** @@ -134,9 +99,12 @@ public abstract class Unit { if (Math.abs(val) >= 100) { return intFormat.format(val); } - if (Math.abs(val) <= 0.005) { + if (Math.abs(val) <= 0.0005) { return "0"; } + if ( Math.abs(val) < 0.095) { + return smallFormat.format(val); + } double sign = Math.signum(val); val = Math.abs(val); @@ -146,7 +114,6 @@ public abstract class Unit { val *= 10; } val = Math.rint(val) / mul * sign; - return decFormat.format(val); } diff --git a/core/test/net/sf/openrocket/unit/UnitToStringTest.java b/core/test/net/sf/openrocket/unit/UnitToStringTest.java index 22aed8a7..6b96a5f1 100644 --- a/core/test/net/sf/openrocket/unit/UnitToStringTest.java +++ b/core/test/net/sf/openrocket/unit/UnitToStringTest.java @@ -7,43 +7,164 @@ import org.junit.Test; public class UnitToStringTest { @Test - public void testToString() { + public void testPositiveToString() { + // very small positive numbers ( < 0.0005) are returned as "0" assertEquals("0",Unit.NOUNIT2.toString(0.00040)); - assertEquals("0",Unit.NOUNIT2.toString(0.00050)); - assertEquals("0",Unit.NOUNIT2.toString(0.00051)); - assertEquals("0",Unit.NOUNIT2.toString(0.00060)); - assertEquals("0",Unit.NOUNIT2.toString(0.0049)); - assertEquals("0",Unit.NOUNIT2.toString(0.0050)); - assertEquals("0.01",Unit.NOUNIT2.toString(0.0051)); - assertEquals("0",Unit.NOUNIT2.toString(0.00123)); - assertEquals("0.01",Unit.NOUNIT2.toString(0.0123)); - assertEquals("0.12",Unit.NOUNIT2.toString(0.1234)); - assertEquals("1.23",Unit.NOUNIT2.toString(1.2345)); - assertEquals("12.3",Unit.NOUNIT2.toString(12.345)); - assertEquals("123",Unit.NOUNIT2.toString(123.456)); - assertEquals("1235",Unit.NOUNIT2.toString(1234.5678)); - assertEquals("12346",Unit.NOUNIT2.toString(12345.6789)); + assertEquals("0",Unit.NOUNIT2.toString(0.00050)); // check boundary of change in format + + // positive number < 0.095 use 3 digit decimal format + assertEquals("0.001",Unit.NOUNIT2.toString(0.00051)); // check boundary of change in format + assertEquals("0.001",Unit.NOUNIT2.toString(0.00060)); + + // rounding at third digit. + assertEquals("0.001",Unit.NOUNIT2.toString(0.0014)); + assertEquals("0.002",Unit.NOUNIT2.toString(0.0015)); // round to even + assertEquals("0.002",Unit.NOUNIT2.toString(0.0016)); + assertEquals("0.002",Unit.NOUNIT2.toString(0.0024)); + assertEquals("0.002",Unit.NOUNIT2.toString(0.0025)); // round to even + assertEquals("0.003",Unit.NOUNIT2.toString(0.0026)); + assertEquals("0.009",Unit.NOUNIT2.toString(0.0094)); + + assertEquals("0.01",Unit.NOUNIT2.toString(0.0095)); // no trailing zeros after rounding + + assertEquals("0.011",Unit.NOUNIT2.toString(0.0114)); + assertEquals("0.012",Unit.NOUNIT2.toString(0.0115)); // round to even + assertEquals("0.012",Unit.NOUNIT2.toString(0.0119)); + assertEquals("0.012",Unit.NOUNIT2.toString(0.0124)); + assertEquals("0.012",Unit.NOUNIT2.toString(0.0125)); // round to even + assertEquals("0.013",Unit.NOUNIT2.toString(0.0129)); + + assertEquals("0.095",Unit.NOUNIT2.toString(0.0949)); // boundary check + + // positive numbers < 100 + assertEquals("0.1",Unit.NOUNIT2.toString(0.095)); // boundary check + + assertEquals("0.11",Unit.NOUNIT2.toString(0.111)); + assertEquals("0.12",Unit.NOUNIT2.toString(0.115)); // round to even + assertEquals("0.12",Unit.NOUNIT2.toString(0.117)); + assertEquals("0.12",Unit.NOUNIT2.toString(0.121)); + assertEquals("0.12",Unit.NOUNIT2.toString(0.125)); // round to even + assertEquals("0.13",Unit.NOUNIT2.toString(0.127)); + + assertEquals("1.11",Unit.NOUNIT2.toString(1.113)); + assertEquals("1.12",Unit.NOUNIT2.toString(1.115)); // round to even + assertEquals("1.12",Unit.NOUNIT2.toString(1.117)); + assertEquals("1.12",Unit.NOUNIT2.toString(1.123)); + assertEquals("1.12",Unit.NOUNIT2.toString(1.125)); // round to even + assertEquals("1.13",Unit.NOUNIT2.toString(1.127)); + + assertEquals("12.3",Unit.NOUNIT2.toString(12.320)); + assertEquals("12.4",Unit.NOUNIT2.toString(12.350)); // round to even + assertEquals("12.4",Unit.NOUNIT2.toString(12.355)); + assertEquals("12.4",Unit.NOUNIT2.toString(12.420)); + assertEquals("12.4",Unit.NOUNIT2.toString(12.450)); // round to even + assertEquals("12.5",Unit.NOUNIT2.toString(12.455)); + + // positive numbers <= 1E6 + assertEquals("123",Unit.NOUNIT2.toString(123.20)); + assertEquals("124",Unit.NOUNIT2.toString(123.50)); // round to even + assertEquals("124",Unit.NOUNIT2.toString(123.55)); + assertEquals("124",Unit.NOUNIT2.toString(124.20)); + assertEquals("124",Unit.NOUNIT2.toString(124.50)); // round to even + assertEquals("125",Unit.NOUNIT2.toString(124.55)); + + assertEquals("1234",Unit.NOUNIT2.toString(1234.2)); + assertEquals("1234",Unit.NOUNIT2.toString(1234.5)); // round to even + assertEquals("1235",Unit.NOUNIT2.toString(1234.6)); + assertEquals("1235",Unit.NOUNIT2.toString(1235.2)); + assertEquals("1236",Unit.NOUNIT2.toString(1235.5)); // round to even + assertEquals("1236",Unit.NOUNIT2.toString(1235.6)); + assertEquals("123457",Unit.NOUNIT2.toString(123456.789)); + + assertEquals("1000000",Unit.NOUNIT2.toString(1000000)); // boundary check + + // positive numbers > 1E6 assertEquals("1.23E6",Unit.NOUNIT2.toString(1234567.89)); assertEquals("1.23E7",Unit.NOUNIT2.toString(12345678.9)); + + + } + + @Test + public void testNegativeToString() { + // very small negative numbers ( < 0.0005) are returned as "0" assertEquals("0",Unit.NOUNIT2.toString(-0.00040)); - assertEquals("0",Unit.NOUNIT2.toString(-0.00050)); - assertEquals("0",Unit.NOUNIT2.toString(-0.00051)); - assertEquals("0",Unit.NOUNIT2.toString(-0.00060)); - assertEquals("0",Unit.NOUNIT2.toString(-0.0049)); - assertEquals("0",Unit.NOUNIT2.toString(-0.0050)); - assertEquals("-0.01",Unit.NOUNIT2.toString(-0.0051)); - assertEquals("0",Unit.NOUNIT2.toString(-0.00123)); - assertEquals("-0.01",Unit.NOUNIT2.toString(-0.0123)); - assertEquals("-0.12",Unit.NOUNIT2.toString(-0.1234)); - assertEquals("-1.23",Unit.NOUNIT2.toString(-1.2345)); - assertEquals("-12.3",Unit.NOUNIT2.toString(-12.345)); - assertEquals("-123",Unit.NOUNIT2.toString(-123.456)); - assertEquals("-1235",Unit.NOUNIT2.toString(-1234.5678)); - assertEquals("-12346",Unit.NOUNIT2.toString(-12345.6789)); + assertEquals("0",Unit.NOUNIT2.toString(-0.00050)); // check boundary of change in format + + // negative number < 0.095 use 3 digit decimal format + assertEquals("-0.001",Unit.NOUNIT2.toString(-0.00051)); // check boundary of change in format + assertEquals("-0.001",Unit.NOUNIT2.toString(-0.00060)); + + // rounding at third digit. + assertEquals("-0.001",Unit.NOUNIT2.toString(-0.0014)); + assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0015)); // round to even + assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0016)); + assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0024)); + assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0025)); // round to even + assertEquals("-0.003",Unit.NOUNIT2.toString(-0.0026)); + assertEquals("-0.009",Unit.NOUNIT2.toString(-0.0094)); + + assertEquals("-0.01",Unit.NOUNIT2.toString(-0.0095)); // no trailing zeros after rounding + + assertEquals("-0.011",Unit.NOUNIT2.toString(-0.0114)); + assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0115)); // round to even + assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0119)); + assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0124)); + assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0125)); // round to even + assertEquals("-0.013",Unit.NOUNIT2.toString(-0.0129)); + + assertEquals("-0.095",Unit.NOUNIT2.toString(-0.0949)); // boundary check + + // negative numbers < 100 + assertEquals("-0.1",Unit.NOUNIT2.toString(-0.095)); // boundary check + + assertEquals("-0.11",Unit.NOUNIT2.toString(-0.111)); + assertEquals("-0.12",Unit.NOUNIT2.toString(-0.115)); // round to even + assertEquals("-0.12",Unit.NOUNIT2.toString(-0.117)); + assertEquals("-0.12",Unit.NOUNIT2.toString(-0.121)); + assertEquals("-0.12",Unit.NOUNIT2.toString(-0.125)); // round to even + assertEquals("-0.13",Unit.NOUNIT2.toString(-0.127)); + + assertEquals("-1.11",Unit.NOUNIT2.toString(-1.113)); + assertEquals("-1.12",Unit.NOUNIT2.toString(-1.115)); // round to even + assertEquals("-1.12",Unit.NOUNIT2.toString(-1.117)); + assertEquals("-1.12",Unit.NOUNIT2.toString(-1.123)); + assertEquals("-1.12",Unit.NOUNIT2.toString(-1.125)); // round to even + assertEquals("-1.13",Unit.NOUNIT2.toString(-1.127)); + + assertEquals("-12.3",Unit.NOUNIT2.toString(-12.320)); + assertEquals("-12.4",Unit.NOUNIT2.toString(-12.350)); // round to even + assertEquals("-12.4",Unit.NOUNIT2.toString(-12.355)); + assertEquals("-12.4",Unit.NOUNIT2.toString(-12.420)); + assertEquals("-12.4",Unit.NOUNIT2.toString(-12.450)); // round to even + assertEquals("-12.5",Unit.NOUNIT2.toString(-12.455)); + + // negative numbers <= 1E6 + assertEquals("-123",Unit.NOUNIT2.toString(-123.20)); + assertEquals("-124",Unit.NOUNIT2.toString(-123.50)); // round to even + assertEquals("-124",Unit.NOUNIT2.toString(-123.55)); + assertEquals("-124",Unit.NOUNIT2.toString(-124.20)); + assertEquals("-124",Unit.NOUNIT2.toString(-124.50)); // round to even + assertEquals("-125",Unit.NOUNIT2.toString(-124.55)); + + assertEquals("-1234",Unit.NOUNIT2.toString(-1234.2)); + assertEquals("-1234",Unit.NOUNIT2.toString(-1234.5)); // round to even + assertEquals("-1235",Unit.NOUNIT2.toString(-1234.6)); + assertEquals("-1235",Unit.NOUNIT2.toString(-1235.2)); + assertEquals("-1236",Unit.NOUNIT2.toString(-1235.5)); // round to even + assertEquals("-1236",Unit.NOUNIT2.toString(-1235.6)); + assertEquals("-123457",Unit.NOUNIT2.toString(-123456.789)); + + assertEquals("-1000000",Unit.NOUNIT2.toString(-1000000)); // boundary check + + // negative numbers > 1E6 assertEquals("-1.23E6",Unit.NOUNIT2.toString(-1234567.89)); assertEquals("-1.23E7",Unit.NOUNIT2.toString(-12345678.9)); - + + } + + } -- 2.39.5