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;
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 java.awt.Color;
@ -230,7 +230,7 @@ public class ComponentAnalysisDialog extends JDialog implements ChangeListener {
new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") {
@Override
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 Unit bestValueUnit = Unit.NOUNIT2;
private Unit bestValueUnit = Unit.NOUNIT;
private int stepCount = 0;
private int evaluationCount = 0;
private double stepSize = 0;

View File

@ -202,7 +202,7 @@ public class GeneralUnit extends Unit {
///// TESTING:
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+"):";
for (int i=0; i<ticks.length; i++) {
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 {
/** No unit with 2 digit precision */
public static final Unit NOUNIT2 = new GeneralUnit(1, "" + Chars.ZWSP, 2);
/** No unit */
public static final Unit NOUNIT = new GeneralUnit(1, "" + Chars.ZWSP, 2);
protected final double multiplier; // meters = units * multiplier
protected final String unit;
@ -101,13 +101,23 @@ public abstract class Unit {
if (Math.abs(val) <= 0.0005) {
return "0";
}
double sign = Math.signum(val);
double mul = 1000.0;
val = Math.abs(val);
val = Math.rint(val*mul) / mul * sign;
val = roundForDecimalFormat(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
@ -128,7 +138,7 @@ public abstract class Unit {
}
/**
* Creates a new Value object with the specified value and this unit.
*
@ -140,7 +150,7 @@ public abstract class Unit {
}
/**
* Round the value (in the current units) to a precision suitable for rough valuing
* (approximately 2 significant numbers).

View File

@ -85,14 +85,14 @@ public class UnitGroup {
*/
static {
UNITS_NONE = new UnitGroup();
UNITS_NONE.addUnit(Unit.NOUNIT2);
UNITS_NONE.addUnit(Unit.NOUNIT);
UNITS_ENERGY = new UnitGroup();
UNITS_ENERGY.addUnit(new GeneralUnit(1, "J"));
UNITS_ENERGY.addUnit(new GeneralUnit(1e-7, "erg"));
UNITS_ENERGY.addUnit(new GeneralUnit(1.055, "BTU"));
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_POWER = new UnitGroup();
@ -104,7 +104,7 @@ public class UnitGroup {
UNITS_POWER.setDefaultUnit(1);
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_VOLTAGE = new UnitGroup();
@ -121,7 +121,7 @@ public class UnitGroup {
UNITS_LENGTH.addUnit(new GeneralUnit(0.001, "mm"));
UNITS_LENGTH.addUnit(new GeneralUnit(0.01, "cm"));
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 GeneralUnit(0.3048, "ft"));
UNITS_LENGTH.setDefaultUnit(1);
@ -346,7 +346,7 @@ public class UnitGroup {
simap.put("m", UNITS_ALL_LENGTHS);
simap.put("m^2", UNITS_AREA);
simap.put("m/s", UNITS_VELOCITY);
simap.put("m/s^2", UNITS_ACCELERATION);
simap.put("m/s^2", UNITS_ACCELERATION);
simap.put("kg", UNITS_MASS);
simap.put("kg m^2", UNITS_INERTIA);
simap.put("kg/m^3", UNITS_DENSITY_BULK);
@ -476,9 +476,9 @@ public class UnitGroup {
defaultUnit = n;
}
public Unit getSIUnit(){
for (Unit u : units){
if (u.multiplier == 1){
public Unit getSIUnit() {
for (Unit u : units) {
if (u.multiplier == 1) {
return u;
}
}
@ -557,7 +557,7 @@ public class UnitGroup {
* @return the value in SI units.
* @see Unit#fromUnit(double)
*/
public double fromUnit( double value ) {
public double fromUnit(double value) {
return this.getDefaultUnit().fromUnit(value);
}
@ -601,26 +601,26 @@ public class UnitGroup {
}
@Override
public String toString(){
return this.getClass().getSimpleName()+":"+this.getSIUnit().toString();
public String toString() {
return this.getClass().getSimpleName() + ":" + this.getSIUnit().toString();
}
@Override
public boolean equals(Object o){
public boolean equals(Object o) {
UnitGroup u = (UnitGroup) o;
int size = units.size();
if (size != u.units.size()){
if (size != u.units.size()) {
return false;
}
for (int i=0; i<size; i++){
if ( !units.get(i).equals(u.units.get(i)) ){
for (int i = 0; i < size; i++) {
if (!units.get(i).equals(u.units.get(i))) {
return false;
}
}
return true;
}
@ -675,12 +675,12 @@ public class UnitGroup {
@Override
public int hashCode() {
int code = 0;
for (Unit u : units){
for (Unit u : units) {
code = code + u.hashCode();
}
return code;
}
/**
* A private class that switches the CaliberUnit to a rocket-specific CaliberUnit.
* All other methods are passed through to UNITS_STABILITY.

View File

@ -44,9 +44,9 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4;
final double p2 = 0.7;
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 Value pvalueValue = new Value(9.81, Unit.NOUNIT2);
final Value pvalueValue = new Value(9.81, Unit.NOUNIT);
final double gvalue = 8.81;
final Point point = new Point(p1, p2);
@ -90,7 +90,7 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4;
final double p2 = 0.7;
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;
// @formatter:off
@ -127,7 +127,7 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4;
final double p2 = 0.7;
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);
// @formatter:off
@ -168,7 +168,7 @@ public class TestRocketOptimizationFunction {
final double p1 = 0.4;
final double p2 = 0.7;
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
context.checking(new Expectations() {{

View File

@ -5,163 +5,166 @@ import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class UnitToStringTest {
@Test
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)); // check boundary of change in format
assertEquals("0", Unit.NOUNIT.toString(0.00040));
assertEquals("0", Unit.NOUNIT.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));
assertEquals("0.001", Unit.NOUNIT.toString(0.00051)); // check boundary of change in format
assertEquals("0.001", Unit.NOUNIT.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
assertEquals("0.001", Unit.NOUNIT.toString(0.0014));
assertEquals("0.002", Unit.NOUNIT.toString(0.0015)); // round to even
assertEquals("0.002", Unit.NOUNIT.toString(0.0016));
assertEquals("0.002", Unit.NOUNIT.toString(0.0024));
assertEquals("0.002", Unit.NOUNIT.toString(0.0025)); // round to even
assertEquals("0.003", Unit.NOUNIT.toString(0.0026));
assertEquals("0.009", Unit.NOUNIT.toString(0.0094));
assertEquals("0.01", Unit.NOUNIT.toString(0.0095)); // no trailing zeros after rounding
assertEquals("0.011", Unit.NOUNIT.toString(0.0114));
assertEquals("0.012", Unit.NOUNIT.toString(0.0115)); // round to even
assertEquals("0.012", Unit.NOUNIT.toString(0.0119));
assertEquals("0.012", Unit.NOUNIT.toString(0.0124));
assertEquals("0.012", Unit.NOUNIT.toString(0.0125)); // round to even
assertEquals("0.013", Unit.NOUNIT.toString(0.0129));
assertEquals("0.095", Unit.NOUNIT.toString(0.0949)); // boundary check
// 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.111", Unit.NOUNIT.toString(0.1111));
assertEquals("0.112", Unit.NOUNIT.toString(0.1115)); // round to even
assertEquals("0.112", Unit.NOUNIT.toString(0.1117));
assertEquals("0.112", Unit.NOUNIT.toString(0.1121));
assertEquals("0.112", Unit.NOUNIT.toString(0.1125)); // round to even
assertEquals("0.113", Unit.NOUNIT.toString(0.1127));
assertEquals("1.11", Unit.NOUNIT.toString(1.113));
assertEquals("1.12", Unit.NOUNIT.toString(1.115)); // round to even
assertEquals("1.12", Unit.NOUNIT.toString(1.117));
assertEquals("1.12", Unit.NOUNIT.toString(1.123));
assertEquals("1.12", Unit.NOUNIT.toString(1.125)); // round to even
assertEquals("1.13", Unit.NOUNIT.toString(1.127));
assertEquals("12.3", Unit.NOUNIT.toString(12.320));
assertEquals("12.4", Unit.NOUNIT.toString(12.350)); // round to even
assertEquals("12.4", Unit.NOUNIT.toString(12.355));
assertEquals("12.4", Unit.NOUNIT.toString(12.420));
assertEquals("12.4", Unit.NOUNIT.toString(12.450)); // round to even
assertEquals("12.5", Unit.NOUNIT.toString(12.455));
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("123", Unit.NOUNIT.toString(123.20));
assertEquals("124", Unit.NOUNIT.toString(123.50)); // round to even
assertEquals("124", Unit.NOUNIT.toString(123.55));
assertEquals("124", Unit.NOUNIT.toString(124.20));
assertEquals("124", Unit.NOUNIT.toString(124.50)); // round to even
assertEquals("125", Unit.NOUNIT.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
assertEquals("1234", Unit.NOUNIT.toString(1234.2));
assertEquals("1234", Unit.NOUNIT.toString(1234.5)); // round to even
assertEquals("1235", Unit.NOUNIT.toString(1234.6));
assertEquals("1235", Unit.NOUNIT.toString(1235.2));
assertEquals("1236", Unit.NOUNIT.toString(1235.5)); // round to even
assertEquals("1236", Unit.NOUNIT.toString(1235.6));
assertEquals("123457", Unit.NOUNIT.toString(123456.789));
assertEquals("1000000", Unit.NOUNIT.toString(1000000)); // boundary check
// positive numbers > 1E6
assertEquals("1.23E6",Unit.NOUNIT2.toString(1234567.89));
assertEquals("1.23E7",Unit.NOUNIT2.toString(12345678.9));
assertEquals("1.23E6", Unit.NOUNIT.toString(1234567.89));
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
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)); // check boundary of change in format
assertEquals("0", Unit.NOUNIT.toString(-0.00040));
assertEquals("0", Unit.NOUNIT.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));
assertEquals("-0.001", Unit.NOUNIT.toString(-0.00051)); // check boundary of change in format
assertEquals("-0.001", Unit.NOUNIT.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
assertEquals("-0.001", Unit.NOUNIT.toString(-0.0014));
assertEquals("-0.002", Unit.NOUNIT.toString(-0.0015)); // round to even
assertEquals("-0.002", Unit.NOUNIT.toString(-0.0016));
assertEquals("-0.002", Unit.NOUNIT.toString(-0.0024));
assertEquals("-0.002", Unit.NOUNIT.toString(-0.0025)); // round to even
assertEquals("-0.003", Unit.NOUNIT.toString(-0.0026));
assertEquals("-0.009", Unit.NOUNIT.toString(-0.0094));
assertEquals("-0.01", Unit.NOUNIT.toString(-0.0095)); // no trailing zeros after rounding
assertEquals("-0.011", Unit.NOUNIT.toString(-0.0114));
assertEquals("-0.012", Unit.NOUNIT.toString(-0.0115)); // round to even
assertEquals("-0.012", Unit.NOUNIT.toString(-0.0119));
assertEquals("-0.012", Unit.NOUNIT.toString(-0.0124));
assertEquals("-0.012", Unit.NOUNIT.toString(-0.0125)); // round to even
assertEquals("-0.013", Unit.NOUNIT.toString(-0.0129));
assertEquals("-0.095", Unit.NOUNIT.toString(-0.0949)); // boundary check
// 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.111", Unit.NOUNIT.toString(-0.1111));
assertEquals("-0.112", Unit.NOUNIT.toString(-0.1115)); // round to even
assertEquals("-0.112", Unit.NOUNIT.toString(-0.1117));
assertEquals("-0.112", Unit.NOUNIT.toString(-0.1121));
assertEquals("-0.112", Unit.NOUNIT.toString(-0.1125)); // round to even
assertEquals("-0.113", Unit.NOUNIT.toString(-0.1127));
assertEquals("-1.11", Unit.NOUNIT.toString(-1.113));
assertEquals("-1.12", Unit.NOUNIT.toString(-1.115)); // round to even
assertEquals("-1.12", Unit.NOUNIT.toString(-1.117));
assertEquals("-1.12", Unit.NOUNIT.toString(-1.123));
assertEquals("-1.12", Unit.NOUNIT.toString(-1.125)); // round to even
assertEquals("-1.13", Unit.NOUNIT.toString(-1.127));
assertEquals("-12.3", Unit.NOUNIT.toString(-12.320));
assertEquals("-12.4", Unit.NOUNIT.toString(-12.350)); // round to even
assertEquals("-12.4", Unit.NOUNIT.toString(-12.355));
assertEquals("-12.4", Unit.NOUNIT.toString(-12.420));
assertEquals("-12.4", Unit.NOUNIT.toString(-12.450)); // round to even
assertEquals("-12.5", Unit.NOUNIT.toString(-12.455));
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("-123", Unit.NOUNIT.toString(-123.20));
assertEquals("-124", Unit.NOUNIT.toString(-123.50)); // round to even
assertEquals("-124", Unit.NOUNIT.toString(-123.55));
assertEquals("-124", Unit.NOUNIT.toString(-124.20));
assertEquals("-124", Unit.NOUNIT.toString(-124.50)); // round to even
assertEquals("-125", Unit.NOUNIT.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
assertEquals("-1234", Unit.NOUNIT.toString(-1234.2));
assertEquals("-1234", Unit.NOUNIT.toString(-1234.5)); // round to even
assertEquals("-1235", Unit.NOUNIT.toString(-1234.6));
assertEquals("-1235", Unit.NOUNIT.toString(-1235.2));
assertEquals("-1236", Unit.NOUNIT.toString(-1235.5)); // round to even
assertEquals("-1236", Unit.NOUNIT.toString(-1235.6));
assertEquals("-123457", Unit.NOUNIT.toString(-123456.789));
assertEquals("-1000000", Unit.NOUNIT.toString(-1000000)); // boundary check
// negative numbers > 1E6
assertEquals("-1.23E6",Unit.NOUNIT2.toString(-1234567.89));
assertEquals("-1.23E7",Unit.NOUNIT2.toString(-12345678.9));
assertEquals("-1.23E6", Unit.NOUNIT.toString(-1234567.89));
assertEquals("-1.23E7", Unit.NOUNIT.toString(-12345678.9));
}