Unit rounding fine-tuning

This commit is contained in:
Sampo Niskanen 2012-09-28 19:42:11 +00:00
parent 2c6c5aa4c3
commit 506dc0c9b7
8 changed files with 195 additions and 162 deletions

View File

@ -1,6 +1,6 @@
package net.sf.openrocket.gui.dialogs; package net.sf.openrocket.gui.dialogs;
import static net.sf.openrocket.unit.Unit.NOUNIT2; import static net.sf.openrocket.unit.Unit.NOUNIT;
import static net.sf.openrocket.util.Chars.ALPHA; import static net.sf.openrocket.util.Chars.ALPHA;
import java.awt.Color; import java.awt.Color;
@ -230,7 +230,7 @@ public class ComponentAnalysisDialog extends JDialog implements ChangeListener {
new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") { new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") {
@Override @Override
public Object getValueAt(int row) { public Object getValueAt(int row) {
return NOUNIT2.toString(cpData.get(row).getCP().weight); return NOUNIT.toString(cpData.get(row).getCP().weight);
} }
} }

View File

@ -179,7 +179,7 @@ public class GeneralOptimizationDialog extends JDialog {
private double bestValue = Double.NaN; private double bestValue = Double.NaN;
private Unit bestValueUnit = Unit.NOUNIT2; private Unit bestValueUnit = Unit.NOUNIT;
private int stepCount = 0; private int stepCount = 0;
private int evaluationCount = 0; private int evaluationCount = 0;
private double stepSize = 0; private double stepSize = 0;

View File

@ -202,7 +202,7 @@ public class GeneralUnit extends Unit {
///// TESTING: ///// TESTING:
private static void printTicks(double start, double end, double minor, double major) { private static void printTicks(double start, double end, double minor, double major) {
Tick[] ticks = Unit.NOUNIT2.getTicks(start, end, minor, major); Tick[] ticks = Unit.NOUNIT.getTicks(start, end, minor, major);
String str = "Ticks for ("+start+","+end+","+minor+","+major+"):"; String str = "Ticks for ("+start+","+end+","+minor+","+major+"):";
for (int i=0; i<ticks.length; i++) { for (int i=0; i<ticks.length; i++) {
str += " "+ticks[i].value; str += " "+ticks[i].value;

View File

@ -0,0 +1,20 @@
package net.sf.openrocket.unit;
/**
* Special unit for inches, which always provides 3-decimal precision.
*/
public class InchUnit extends GeneralUnit {
public InchUnit(double multiplier, String unit) {
super(multiplier, unit);
}
@Override
protected double roundForDecimalFormat(double val) {
double mul = 1000.0;
val = Math.rint(val * mul) / mul;
return val;
}
}

View File

@ -6,8 +6,8 @@ import net.sf.openrocket.util.Chars;
public abstract class Unit { public abstract class Unit {
/** No unit with 2 digit precision */ /** No unit */
public static final Unit NOUNIT2 = new GeneralUnit(1, "" + Chars.ZWSP, 2); public static final Unit NOUNIT = new GeneralUnit(1, "" + Chars.ZWSP, 2);
protected final double multiplier; // meters = units * multiplier protected final double multiplier; // meters = units * multiplier
protected final String unit; protected final String unit;
@ -101,13 +101,23 @@ public abstract class Unit {
if (Math.abs(val) <= 0.0005) { if (Math.abs(val) <= 0.0005) {
return "0"; return "0";
} }
double sign = Math.signum(val);
double mul = 1000.0; val = roundForDecimalFormat(val);
val = Math.abs(val);
val = Math.rint(val*mul) / mul * sign;
return decFormat.format(val); return decFormat.format(val);
} }
protected double roundForDecimalFormat(double val) {
double sign = Math.signum(val);
val = Math.abs(val);
double mul = 1.0;
while (val < 100) {
mul *= 10;
val *= 10;
}
val = Math.rint(val) / mul * sign;
return val;
}
/** /**
* Return a string with the specified value and unit. The value is converted into * Return a string with the specified value and unit. The value is converted into

View File

@ -85,14 +85,14 @@ public class UnitGroup {
*/ */
static { static {
UNITS_NONE = new UnitGroup(); UNITS_NONE = new UnitGroup();
UNITS_NONE.addUnit(Unit.NOUNIT2); UNITS_NONE.addUnit(Unit.NOUNIT);
UNITS_ENERGY = new UnitGroup(); UNITS_ENERGY = new UnitGroup();
UNITS_ENERGY.addUnit(new GeneralUnit(1, "J")); UNITS_ENERGY.addUnit(new GeneralUnit(1, "J"));
UNITS_ENERGY.addUnit(new GeneralUnit(1e-7, "erg")); UNITS_ENERGY.addUnit(new GeneralUnit(1e-7, "erg"));
UNITS_ENERGY.addUnit(new GeneralUnit(1.055, "BTU")); UNITS_ENERGY.addUnit(new GeneralUnit(1.055, "BTU"));
UNITS_ENERGY.addUnit(new GeneralUnit(4.184, "cal")); UNITS_ENERGY.addUnit(new GeneralUnit(4.184, "cal"));
UNITS_ENERGY.addUnit(new GeneralUnit(1.3558179483314, "ft"+DOT+"lbf")); UNITS_ENERGY.addUnit(new GeneralUnit(1.3558179483314, "ft" + DOT + "lbf"));
UNITS_ENERGY.setDefaultUnit(0); UNITS_ENERGY.setDefaultUnit(0);
UNITS_POWER = new UnitGroup(); UNITS_POWER = new UnitGroup();
@ -104,7 +104,7 @@ public class UnitGroup {
UNITS_POWER.setDefaultUnit(1); UNITS_POWER.setDefaultUnit(1);
UNITS_MOMENTUM = new UnitGroup(); UNITS_MOMENTUM = new UnitGroup();
UNITS_MOMENTUM.addUnit(new GeneralUnit(1, "kg"+DOT+"m/s")); UNITS_MOMENTUM.addUnit(new GeneralUnit(1, "kg" + DOT + "m/s"));
UNITS_MOMENTUM.setDefaultUnit(0); UNITS_MOMENTUM.setDefaultUnit(0);
UNITS_VOLTAGE = new UnitGroup(); UNITS_VOLTAGE = new UnitGroup();
@ -121,7 +121,7 @@ public class UnitGroup {
UNITS_LENGTH.addUnit(new GeneralUnit(0.001, "mm")); UNITS_LENGTH.addUnit(new GeneralUnit(0.001, "mm"));
UNITS_LENGTH.addUnit(new GeneralUnit(0.01, "cm")); UNITS_LENGTH.addUnit(new GeneralUnit(0.01, "cm"));
UNITS_LENGTH.addUnit(new GeneralUnit(1, "m")); UNITS_LENGTH.addUnit(new GeneralUnit(1, "m"));
UNITS_LENGTH.addUnit(new GeneralUnit(0.0254, "in")); UNITS_LENGTH.addUnit(new InchUnit(0.0254, "in"));
UNITS_LENGTH.addUnit(new FractionalUnit(0.0254, "in/64", "in", 64, 1d / 16d, 0.5d / 64d)); UNITS_LENGTH.addUnit(new FractionalUnit(0.0254, "in/64", "in", 64, 1d / 16d, 0.5d / 64d));
UNITS_LENGTH.addUnit(new GeneralUnit(0.3048, "ft")); UNITS_LENGTH.addUnit(new GeneralUnit(0.3048, "ft"));
UNITS_LENGTH.setDefaultUnit(1); UNITS_LENGTH.setDefaultUnit(1);
@ -476,9 +476,9 @@ public class UnitGroup {
defaultUnit = n; defaultUnit = n;
} }
public Unit getSIUnit(){ public Unit getSIUnit() {
for (Unit u : units){ for (Unit u : units) {
if (u.multiplier == 1){ if (u.multiplier == 1) {
return u; return u;
} }
} }
@ -557,7 +557,7 @@ public class UnitGroup {
* @return the value in SI units. * @return the value in SI units.
* @see Unit#fromUnit(double) * @see Unit#fromUnit(double)
*/ */
public double fromUnit( double value ) { public double fromUnit(double value) {
return this.getDefaultUnit().fromUnit(value); return this.getDefaultUnit().fromUnit(value);
} }
@ -601,20 +601,20 @@ public class UnitGroup {
} }
@Override @Override
public String toString(){ public String toString() {
return this.getClass().getSimpleName()+":"+this.getSIUnit().toString(); return this.getClass().getSimpleName() + ":" + this.getSIUnit().toString();
} }
@Override @Override
public boolean equals(Object o){ public boolean equals(Object o) {
UnitGroup u = (UnitGroup) o; UnitGroup u = (UnitGroup) o;
int size = units.size(); int size = units.size();
if (size != u.units.size()){ if (size != u.units.size()) {
return false; return false;
} }
for (int i=0; i<size; i++){ for (int i = 0; i < size; i++) {
if ( !units.get(i).equals(u.units.get(i)) ){ if (!units.get(i).equals(u.units.get(i))) {
return false; return false;
} }
} }
@ -675,7 +675,7 @@ public class UnitGroup {
@Override @Override
public int hashCode() { public int hashCode() {
int code = 0; int code = 0;
for (Unit u : units){ for (Unit u : units) {
code = code + u.hashCode(); code = code + u.hashCode();
} }
return code; return code;

View File

@ -44,9 +44,9 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4; final double p1 = 0.4;
final double p2 = 0.7; final double p2 = 0.7;
final double ddist = -0.43; final double ddist = -0.43;
final Value dref = new Value(ddist, Unit.NOUNIT2); final Value dref = new Value(ddist, Unit.NOUNIT);
final double pvalue = 9.81; final double pvalue = 9.81;
final Value pvalueValue = new Value(9.81, Unit.NOUNIT2); final Value pvalueValue = new Value(9.81, Unit.NOUNIT);
final double gvalue = 8.81; final double gvalue = 8.81;
final Point point = new Point(p1, p2); final Point point = new Point(p1, p2);
@ -90,7 +90,7 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4; final double p1 = 0.4;
final double p2 = 0.7; final double p2 = 0.7;
final double ddist = -0.43; final double ddist = -0.43;
final Value dref = new Value(0.33, Unit.NOUNIT2); final Value dref = new Value(0.33, Unit.NOUNIT);
final double pvalue = 9.81; final double pvalue = 9.81;
// @formatter:off // @formatter:off
@ -127,7 +127,7 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4; final double p1 = 0.4;
final double p2 = 0.7; final double p2 = 0.7;
final double ddist = 0.98; final double ddist = 0.98;
final Value dref = new Value(ddist, Unit.NOUNIT2); final Value dref = new Value(ddist, Unit.NOUNIT);
final Point point = new Point(p1, p2); final Point point = new Point(p1, p2);
// @formatter:off // @formatter:off
@ -168,7 +168,7 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4; final double p1 = 0.4;
final double p2 = 0.7; final double p2 = 0.7;
final double ddist = Double.NaN; final double ddist = Double.NaN;
final Value dref = new Value(0.33, Unit.NOUNIT2); final Value dref = new Value(0.33, Unit.NOUNIT);
// @formatter:off // @formatter:off
context.checking(new Expectations() {{ context.checking(new Expectations() {{

View File

@ -9,159 +9,162 @@ public class UnitToStringTest {
@Test @Test
public void testPositiveToString() { public void testPositiveToString() {
// very small positive numbers ( < 0.0005) are returned as "0" // very small positive numbers ( < 0.0005) are returned as "0"
assertEquals("0",Unit.NOUNIT2.toString(0.00040)); assertEquals("0", Unit.NOUNIT.toString(0.00040));
assertEquals("0",Unit.NOUNIT2.toString(0.00050)); // check boundary of change in format assertEquals("0", Unit.NOUNIT.toString(0.00050)); // check boundary of change in format
// positive number < 0.095 use 3 digit decimal 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.NOUNIT.toString(0.00051)); // check boundary of change in format
assertEquals("0.001",Unit.NOUNIT2.toString(0.00060)); assertEquals("0.001", Unit.NOUNIT.toString(0.00060));
// rounding at third digit. // rounding at third digit.
assertEquals("0.001",Unit.NOUNIT2.toString(0.0014)); assertEquals("0.001", Unit.NOUNIT.toString(0.0014));
assertEquals("0.002",Unit.NOUNIT2.toString(0.0015)); // round to even assertEquals("0.002", Unit.NOUNIT.toString(0.0015)); // round to even
assertEquals("0.002",Unit.NOUNIT2.toString(0.0016)); assertEquals("0.002", Unit.NOUNIT.toString(0.0016));
assertEquals("0.002",Unit.NOUNIT2.toString(0.0024)); assertEquals("0.002", Unit.NOUNIT.toString(0.0024));
assertEquals("0.002",Unit.NOUNIT2.toString(0.0025)); // round to even assertEquals("0.002", Unit.NOUNIT.toString(0.0025)); // round to even
assertEquals("0.003",Unit.NOUNIT2.toString(0.0026)); assertEquals("0.003", Unit.NOUNIT.toString(0.0026));
assertEquals("0.009",Unit.NOUNIT2.toString(0.0094)); assertEquals("0.009", Unit.NOUNIT.toString(0.0094));
assertEquals("0.01",Unit.NOUNIT2.toString(0.0095)); // no trailing zeros after rounding assertEquals("0.01", Unit.NOUNIT.toString(0.0095)); // no trailing zeros after rounding
assertEquals("0.011",Unit.NOUNIT2.toString(0.0114)); assertEquals("0.011", Unit.NOUNIT.toString(0.0114));
assertEquals("0.012",Unit.NOUNIT2.toString(0.0115)); // round to even assertEquals("0.012", Unit.NOUNIT.toString(0.0115)); // round to even
assertEquals("0.012",Unit.NOUNIT2.toString(0.0119)); assertEquals("0.012", Unit.NOUNIT.toString(0.0119));
assertEquals("0.012",Unit.NOUNIT2.toString(0.0124)); assertEquals("0.012", Unit.NOUNIT.toString(0.0124));
assertEquals("0.012",Unit.NOUNIT2.toString(0.0125)); // round to even assertEquals("0.012", Unit.NOUNIT.toString(0.0125)); // round to even
assertEquals("0.013",Unit.NOUNIT2.toString(0.0129)); assertEquals("0.013", Unit.NOUNIT.toString(0.0129));
assertEquals("0.095",Unit.NOUNIT2.toString(0.0949)); // boundary check assertEquals("0.095", Unit.NOUNIT.toString(0.0949)); // boundary check
// positive numbers < 100 // positive numbers < 100
assertEquals("0.1",Unit.NOUNIT2.toString(0.095)); // boundary check assertEquals("0.01", Unit.NOUNIT.toString(0.0095)); // boundary check
assertEquals("0.11",Unit.NOUNIT2.toString(0.111)); assertEquals("0.111", Unit.NOUNIT.toString(0.1111));
assertEquals("0.12",Unit.NOUNIT2.toString(0.115)); // round to even assertEquals("0.112", Unit.NOUNIT.toString(0.1115)); // round to even
assertEquals("0.12",Unit.NOUNIT2.toString(0.117)); assertEquals("0.112", Unit.NOUNIT.toString(0.1117));
assertEquals("0.12",Unit.NOUNIT2.toString(0.121)); assertEquals("0.112", Unit.NOUNIT.toString(0.1121));
assertEquals("0.12",Unit.NOUNIT2.toString(0.125)); // round to even assertEquals("0.112", Unit.NOUNIT.toString(0.1125)); // round to even
assertEquals("0.13",Unit.NOUNIT2.toString(0.127)); assertEquals("0.113", Unit.NOUNIT.toString(0.1127));
assertEquals("1.11",Unit.NOUNIT2.toString(1.113)); assertEquals("1.11", Unit.NOUNIT.toString(1.113));
assertEquals("1.12",Unit.NOUNIT2.toString(1.115)); // round to even assertEquals("1.12", Unit.NOUNIT.toString(1.115)); // round to even
assertEquals("1.12",Unit.NOUNIT2.toString(1.117)); assertEquals("1.12", Unit.NOUNIT.toString(1.117));
assertEquals("1.12",Unit.NOUNIT2.toString(1.123)); assertEquals("1.12", Unit.NOUNIT.toString(1.123));
assertEquals("1.12",Unit.NOUNIT2.toString(1.125)); // round to even assertEquals("1.12", Unit.NOUNIT.toString(1.125)); // round to even
assertEquals("1.13",Unit.NOUNIT2.toString(1.127)); assertEquals("1.13", Unit.NOUNIT.toString(1.127));
assertEquals("12.3",Unit.NOUNIT2.toString(12.320)); assertEquals("12.3", Unit.NOUNIT.toString(12.320));
assertEquals("12.4",Unit.NOUNIT2.toString(12.350)); // round to even assertEquals("12.4", Unit.NOUNIT.toString(12.350)); // round to even
assertEquals("12.4",Unit.NOUNIT2.toString(12.355)); assertEquals("12.4", Unit.NOUNIT.toString(12.355));
assertEquals("12.4",Unit.NOUNIT2.toString(12.420)); assertEquals("12.4", Unit.NOUNIT.toString(12.420));
assertEquals("12.4",Unit.NOUNIT2.toString(12.450)); // round to even assertEquals("12.4", Unit.NOUNIT.toString(12.450)); // round to even
assertEquals("12.5",Unit.NOUNIT2.toString(12.455)); assertEquals("12.5", Unit.NOUNIT.toString(12.455));
// positive numbers <= 1E6 // positive numbers <= 1E6
assertEquals("123",Unit.NOUNIT2.toString(123.20)); assertEquals("123", Unit.NOUNIT.toString(123.20));
assertEquals("124",Unit.NOUNIT2.toString(123.50)); // round to even assertEquals("124", Unit.NOUNIT.toString(123.50)); // round to even
assertEquals("124",Unit.NOUNIT2.toString(123.55)); assertEquals("124", Unit.NOUNIT.toString(123.55));
assertEquals("124",Unit.NOUNIT2.toString(124.20)); assertEquals("124", Unit.NOUNIT.toString(124.20));
assertEquals("124",Unit.NOUNIT2.toString(124.50)); // round to even assertEquals("124", Unit.NOUNIT.toString(124.50)); // round to even
assertEquals("125",Unit.NOUNIT2.toString(124.55)); assertEquals("125", Unit.NOUNIT.toString(124.55));
assertEquals("1234",Unit.NOUNIT2.toString(1234.2)); assertEquals("1234", Unit.NOUNIT.toString(1234.2));
assertEquals("1234",Unit.NOUNIT2.toString(1234.5)); // round to even assertEquals("1234", Unit.NOUNIT.toString(1234.5)); // round to even
assertEquals("1235",Unit.NOUNIT2.toString(1234.6)); assertEquals("1235", Unit.NOUNIT.toString(1234.6));
assertEquals("1235",Unit.NOUNIT2.toString(1235.2)); assertEquals("1235", Unit.NOUNIT.toString(1235.2));
assertEquals("1236",Unit.NOUNIT2.toString(1235.5)); // round to even assertEquals("1236", Unit.NOUNIT.toString(1235.5)); // round to even
assertEquals("1236",Unit.NOUNIT2.toString(1235.6)); assertEquals("1236", Unit.NOUNIT.toString(1235.6));
assertEquals("123457",Unit.NOUNIT2.toString(123456.789)); assertEquals("123457", Unit.NOUNIT.toString(123456.789));
assertEquals("1000000",Unit.NOUNIT2.toString(1000000)); // boundary check assertEquals("1000000", Unit.NOUNIT.toString(1000000)); // boundary check
// positive numbers > 1E6 // positive numbers > 1E6
assertEquals("1.23E6",Unit.NOUNIT2.toString(1234567.89)); assertEquals("1.23E6", Unit.NOUNIT.toString(1234567.89));
assertEquals("1.23E7",Unit.NOUNIT2.toString(12345678.9)); assertEquals("1.23E7", Unit.NOUNIT.toString(12345678.9));
// Inch precision
assertEquals("25.125", UnitGroup.UNITS_LENGTH.findApproximate("in").toString(25.125 * 25.4 / 1000));
} }
@Test @Test
public void testNegativeToString() { public void testNegativeToString() {
// very small negative numbers ( < 0.0005) are returned as "0" // very small negative numbers ( < 0.0005) are returned as "0"
assertEquals("0",Unit.NOUNIT2.toString(-0.00040)); assertEquals("0", Unit.NOUNIT.toString(-0.00040));
assertEquals("0",Unit.NOUNIT2.toString(-0.00050)); // check boundary of change in format assertEquals("0", Unit.NOUNIT.toString(-0.00050)); // check boundary of change in format
// negative number < 0.095 use 3 digit decimal 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.NOUNIT.toString(-0.00051)); // check boundary of change in format
assertEquals("-0.001",Unit.NOUNIT2.toString(-0.00060)); assertEquals("-0.001", Unit.NOUNIT.toString(-0.00060));
// rounding at third digit. // rounding at third digit.
assertEquals("-0.001",Unit.NOUNIT2.toString(-0.0014)); assertEquals("-0.001", Unit.NOUNIT.toString(-0.0014));
assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0015)); // round to even assertEquals("-0.002", Unit.NOUNIT.toString(-0.0015)); // round to even
assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0016)); assertEquals("-0.002", Unit.NOUNIT.toString(-0.0016));
assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0024)); assertEquals("-0.002", Unit.NOUNIT.toString(-0.0024));
assertEquals("-0.002",Unit.NOUNIT2.toString(-0.0025)); // round to even assertEquals("-0.002", Unit.NOUNIT.toString(-0.0025)); // round to even
assertEquals("-0.003",Unit.NOUNIT2.toString(-0.0026)); assertEquals("-0.003", Unit.NOUNIT.toString(-0.0026));
assertEquals("-0.009",Unit.NOUNIT2.toString(-0.0094)); assertEquals("-0.009", Unit.NOUNIT.toString(-0.0094));
assertEquals("-0.01",Unit.NOUNIT2.toString(-0.0095)); // no trailing zeros after rounding assertEquals("-0.01", Unit.NOUNIT.toString(-0.0095)); // no trailing zeros after rounding
assertEquals("-0.011",Unit.NOUNIT2.toString(-0.0114)); assertEquals("-0.011", Unit.NOUNIT.toString(-0.0114));
assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0115)); // round to even assertEquals("-0.012", Unit.NOUNIT.toString(-0.0115)); // round to even
assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0119)); assertEquals("-0.012", Unit.NOUNIT.toString(-0.0119));
assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0124)); assertEquals("-0.012", Unit.NOUNIT.toString(-0.0124));
assertEquals("-0.012",Unit.NOUNIT2.toString(-0.0125)); // round to even assertEquals("-0.012", Unit.NOUNIT.toString(-0.0125)); // round to even
assertEquals("-0.013",Unit.NOUNIT2.toString(-0.0129)); assertEquals("-0.013", Unit.NOUNIT.toString(-0.0129));
assertEquals("-0.095",Unit.NOUNIT2.toString(-0.0949)); // boundary check assertEquals("-0.095", Unit.NOUNIT.toString(-0.0949)); // boundary check
// negative numbers < 100 // negative numbers < 100
assertEquals("-0.1",Unit.NOUNIT2.toString(-0.095)); // boundary check assertEquals("-0.01", Unit.NOUNIT.toString(-0.0095)); // boundary check
assertEquals("-0.11",Unit.NOUNIT2.toString(-0.111)); assertEquals("-0.111", Unit.NOUNIT.toString(-0.1111));
assertEquals("-0.12",Unit.NOUNIT2.toString(-0.115)); // round to even assertEquals("-0.112", Unit.NOUNIT.toString(-0.1115)); // round to even
assertEquals("-0.12",Unit.NOUNIT2.toString(-0.117)); assertEquals("-0.112", Unit.NOUNIT.toString(-0.1117));
assertEquals("-0.12",Unit.NOUNIT2.toString(-0.121)); assertEquals("-0.112", Unit.NOUNIT.toString(-0.1121));
assertEquals("-0.12",Unit.NOUNIT2.toString(-0.125)); // round to even assertEquals("-0.112", Unit.NOUNIT.toString(-0.1125)); // round to even
assertEquals("-0.13",Unit.NOUNIT2.toString(-0.127)); assertEquals("-0.113", Unit.NOUNIT.toString(-0.1127));
assertEquals("-1.11",Unit.NOUNIT2.toString(-1.113)); assertEquals("-1.11", Unit.NOUNIT.toString(-1.113));
assertEquals("-1.12",Unit.NOUNIT2.toString(-1.115)); // round to even assertEquals("-1.12", Unit.NOUNIT.toString(-1.115)); // round to even
assertEquals("-1.12",Unit.NOUNIT2.toString(-1.117)); assertEquals("-1.12", Unit.NOUNIT.toString(-1.117));
assertEquals("-1.12",Unit.NOUNIT2.toString(-1.123)); assertEquals("-1.12", Unit.NOUNIT.toString(-1.123));
assertEquals("-1.12",Unit.NOUNIT2.toString(-1.125)); // round to even assertEquals("-1.12", Unit.NOUNIT.toString(-1.125)); // round to even
assertEquals("-1.13",Unit.NOUNIT2.toString(-1.127)); assertEquals("-1.13", Unit.NOUNIT.toString(-1.127));
assertEquals("-12.3",Unit.NOUNIT2.toString(-12.320)); assertEquals("-12.3", Unit.NOUNIT.toString(-12.320));
assertEquals("-12.4",Unit.NOUNIT2.toString(-12.350)); // round to even assertEquals("-12.4", Unit.NOUNIT.toString(-12.350)); // round to even
assertEquals("-12.4",Unit.NOUNIT2.toString(-12.355)); assertEquals("-12.4", Unit.NOUNIT.toString(-12.355));
assertEquals("-12.4",Unit.NOUNIT2.toString(-12.420)); assertEquals("-12.4", Unit.NOUNIT.toString(-12.420));
assertEquals("-12.4",Unit.NOUNIT2.toString(-12.450)); // round to even assertEquals("-12.4", Unit.NOUNIT.toString(-12.450)); // round to even
assertEquals("-12.5",Unit.NOUNIT2.toString(-12.455)); assertEquals("-12.5", Unit.NOUNIT.toString(-12.455));
// negative numbers <= 1E6 // negative numbers <= 1E6
assertEquals("-123",Unit.NOUNIT2.toString(-123.20)); assertEquals("-123", Unit.NOUNIT.toString(-123.20));
assertEquals("-124",Unit.NOUNIT2.toString(-123.50)); // round to even assertEquals("-124", Unit.NOUNIT.toString(-123.50)); // round to even
assertEquals("-124",Unit.NOUNIT2.toString(-123.55)); assertEquals("-124", Unit.NOUNIT.toString(-123.55));
assertEquals("-124",Unit.NOUNIT2.toString(-124.20)); assertEquals("-124", Unit.NOUNIT.toString(-124.20));
assertEquals("-124",Unit.NOUNIT2.toString(-124.50)); // round to even assertEquals("-124", Unit.NOUNIT.toString(-124.50)); // round to even
assertEquals("-125",Unit.NOUNIT2.toString(-124.55)); assertEquals("-125", Unit.NOUNIT.toString(-124.55));
assertEquals("-1234",Unit.NOUNIT2.toString(-1234.2)); assertEquals("-1234", Unit.NOUNIT.toString(-1234.2));
assertEquals("-1234",Unit.NOUNIT2.toString(-1234.5)); // round to even assertEquals("-1234", Unit.NOUNIT.toString(-1234.5)); // round to even
assertEquals("-1235",Unit.NOUNIT2.toString(-1234.6)); assertEquals("-1235", Unit.NOUNIT.toString(-1234.6));
assertEquals("-1235",Unit.NOUNIT2.toString(-1235.2)); assertEquals("-1235", Unit.NOUNIT.toString(-1235.2));
assertEquals("-1236",Unit.NOUNIT2.toString(-1235.5)); // round to even assertEquals("-1236", Unit.NOUNIT.toString(-1235.5)); // round to even
assertEquals("-1236",Unit.NOUNIT2.toString(-1235.6)); assertEquals("-1236", Unit.NOUNIT.toString(-1235.6));
assertEquals("-123457",Unit.NOUNIT2.toString(-123456.789)); assertEquals("-123457", Unit.NOUNIT.toString(-123456.789));
assertEquals("-1000000",Unit.NOUNIT2.toString(-1000000)); // boundary check assertEquals("-1000000", Unit.NOUNIT.toString(-1000000)); // boundary check
// negative numbers > 1E6 // negative numbers > 1E6
assertEquals("-1.23E6",Unit.NOUNIT2.toString(-1234567.89)); assertEquals("-1.23E6", Unit.NOUNIT.toString(-1234567.89));
assertEquals("-1.23E7",Unit.NOUNIT2.toString(-12345678.9)); assertEquals("-1.23E7", Unit.NOUNIT.toString(-12345678.9));
} }