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).

This commit is contained in:
Kevin Ruland 2012-04-20 18:54:47 +00:00
parent b6307745ca
commit d8821bcfdb
2 changed files with 156 additions and 68 deletions

View File

@ -70,42 +70,6 @@ public abstract class Unit {
return true; 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 @Override
public String toString() { public String toString() {
return unit; return unit;
@ -115,6 +79,7 @@ public abstract class Unit {
private static final DecimalFormat intFormat = new DecimalFormat("#"); private static final DecimalFormat intFormat = new DecimalFormat("#");
private static final DecimalFormat decFormat = new DecimalFormat("0.##"); 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"); private static final DecimalFormat expFormat = new DecimalFormat("0.00E0");
/** /**
@ -134,9 +99,12 @@ public abstract class Unit {
if (Math.abs(val) >= 100) { if (Math.abs(val) >= 100) {
return intFormat.format(val); return intFormat.format(val);
} }
if (Math.abs(val) <= 0.005) { if (Math.abs(val) <= 0.0005) {
return "0"; return "0";
} }
if ( Math.abs(val) < 0.095) {
return smallFormat.format(val);
}
double sign = Math.signum(val); double sign = Math.signum(val);
val = Math.abs(val); val = Math.abs(val);
@ -146,7 +114,6 @@ public abstract class Unit {
val *= 10; val *= 10;
} }
val = Math.rint(val) / mul * sign; val = Math.rint(val) / mul * sign;
return decFormat.format(val); return decFormat.format(val);
} }

View File

@ -7,43 +7,164 @@ import org.junit.Test;
public class UnitToStringTest { public class UnitToStringTest {
@Test @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.00040));
assertEquals("0",Unit.NOUNIT2.toString(0.00050)); assertEquals("0",Unit.NOUNIT2.toString(0.00050)); // check boundary of change in format
assertEquals("0",Unit.NOUNIT2.toString(0.00051));
assertEquals("0",Unit.NOUNIT2.toString(0.00060)); // positive number < 0.095 use 3 digit decimal format
assertEquals("0",Unit.NOUNIT2.toString(0.0049)); assertEquals("0.001",Unit.NOUNIT2.toString(0.00051)); // check boundary of change in format
assertEquals("0",Unit.NOUNIT2.toString(0.0050)); assertEquals("0.001",Unit.NOUNIT2.toString(0.00060));
assertEquals("0.01",Unit.NOUNIT2.toString(0.0051));
assertEquals("0",Unit.NOUNIT2.toString(0.00123)); // rounding at third digit.
assertEquals("0.01",Unit.NOUNIT2.toString(0.0123)); assertEquals("0.001",Unit.NOUNIT2.toString(0.0014));
assertEquals("0.12",Unit.NOUNIT2.toString(0.1234)); assertEquals("0.002",Unit.NOUNIT2.toString(0.0015)); // round to even
assertEquals("1.23",Unit.NOUNIT2.toString(1.2345)); assertEquals("0.002",Unit.NOUNIT2.toString(0.0016));
assertEquals("12.3",Unit.NOUNIT2.toString(12.345)); assertEquals("0.002",Unit.NOUNIT2.toString(0.0024));
assertEquals("123",Unit.NOUNIT2.toString(123.456)); assertEquals("0.002",Unit.NOUNIT2.toString(0.0025)); // round to even
assertEquals("1235",Unit.NOUNIT2.toString(1234.5678)); assertEquals("0.003",Unit.NOUNIT2.toString(0.0026));
assertEquals("12346",Unit.NOUNIT2.toString(12345.6789)); 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("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.23E6",Unit.NOUNIT2.toString(1234567.89));
assertEquals("1.23E7",Unit.NOUNIT2.toString(12345678.9)); 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.00040));
assertEquals("0",Unit.NOUNIT2.toString(-0.00050)); assertEquals("0",Unit.NOUNIT2.toString(-0.00050)); // check boundary of change in format
assertEquals("0",Unit.NOUNIT2.toString(-0.00051));
assertEquals("0",Unit.NOUNIT2.toString(-0.00060)); // negative number < 0.095 use 3 digit decimal format
assertEquals("0",Unit.NOUNIT2.toString(-0.0049)); assertEquals("-0.001",Unit.NOUNIT2.toString(-0.00051)); // check boundary of change in format
assertEquals("0",Unit.NOUNIT2.toString(-0.0050)); assertEquals("-0.001",Unit.NOUNIT2.toString(-0.00060));
assertEquals("-0.01",Unit.NOUNIT2.toString(-0.0051));
assertEquals("0",Unit.NOUNIT2.toString(-0.00123)); // rounding at third digit.
assertEquals("-0.01",Unit.NOUNIT2.toString(-0.0123)); assertEquals("-0.001",Unit.NOUNIT2.toString(-0.0014));
assertEquals("-0.12",Unit.NOUNIT2.toString(-0.1234)); assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0015)); // round to even
assertEquals("-1.23",Unit.NOUNIT2.toString(-1.2345)); assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0016));
assertEquals("-12.3",Unit.NOUNIT2.toString(-12.345)); assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0024));
assertEquals("-123",Unit.NOUNIT2.toString(-123.456)); assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0025)); // round to even
assertEquals("-1235",Unit.NOUNIT2.toString(-1234.5678)); assertEquals("-0.003",Unit.NOUNIT2.toString(-0.0026));
assertEquals("-12346",Unit.NOUNIT2.toString(-12345.6789)); 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("-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.23E6",Unit.NOUNIT2.toString(-1234567.89));
assertEquals("-1.23E7",Unit.NOUNIT2.toString(-12345678.9)); assertEquals("-1.23E7",Unit.NOUNIT2.toString(-12345678.9));
} }
} }