2014-10-13 17 views
6

Was ist der einfachste Weg, um eine Java BigDecimal enthält einen beliebigen Wert in eine kanonische Form zu verringern, so dass zwei BigDecimal ‚s die gleiche Zahl, die gleich vergleichen, wird die equals() Methode?kanonische Darstellung eines BigDecimal

ich meine Zahlen ist Parsen von beliebigen Zeichenkette Code wie folgt verwendet:

BigDecimal x = new BigDecimal(string1, MathContext.DECIMAL64); 
BigDecimal y = new BigDecimal(string2, MathContext.DECIMAL64); 

Da (string1, string2) willkürlich sind, könnten sie sein, zB ("1", "1.0000") oder ("-32.5", "1981") ...

Was ich suche ist die einfachste (kürzeste/sauberste Code) Implementierung des Verfahrens canonicalize, für die die obige Behauptung

assert x.compareTo(y) != 0 || 
    (canonicalize(x).equals(canonicalize(y)) && 
    x.compareTo(canonicalize(x)) == 0 && y.compareTo(canonicalize(y)) == 0); 

erfolgreich sein wird ...:

public static BigDecimal canonicalize(BigDecimal b) { 
    // TODO: 
} 
+5

Warum würden Sie dies benötigen, anstatt einfach 'compareTo' verwenden? –

+1

Kannst du 'x.setScale (y.scale())' nicht verwenden? – Keppil

+0

@Keppil, ich suche die Dokumentation an jetzt und es sieht so aus, du hast Recht: [“ Gibt ein' BigDecimal' dessen Skala der angegebene Wert ist, und deren Wert numerisch gleich dieser 'BigDecimal' ist. „] (http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#setScale-int-) – 0xbe5077ed

Antwort

2

Wenn Sie wissen wollen, ob zwei BigDecimal s gleich unabhängig von der Größe sind, verwenden nur .compareTo()

public static boolean bigDecimalEquals(BigDecimal b1, BigDecimal b2) { 
    return b1.compareTo(b1) == 0; 
} 

Es empfiehlt speziell dieses in the Javadoc

Zwei BigDecimal-Objekte, die den gleichen Wert haben, aber einen anderen Maßstab haben (wie 2.0 und 2.00) werden mit dieser Methode als gleich angesehen. Dieses Verfahren wird bevorzugt gegenüber einzelnen Methoden für jede der sechs boolean Vergleichsoperatoren (<, ==,>,> =,! =, < =) zur Verfügung gestellt.


Wenn Sie tatsächlich die BigDecimal so zu konvertieren, dass .equals() arbeiten, benutzen Sie einfach die setScale Methode.

+0

für die Bezugnahme auf 'setScale akzeptiert()', wie erwähnt @ Keppil früher. Es sollte aus meinem ursprünglichen Beitrag offensichtlich sein, dass ich über compareTo() weiß und das nicht benötigt habe. – 0xbe5077ed

0

Verwendung stripTrailingZeros(). Dies ergibt ein Äquivalent BigDecimal mit der Skala minimiert und ist der einfachste Weg, um eine kanonische Darstellung zu erhalten. Es ist besser als setScale(), weil es irgendwelche Probleme mit der Rundung vermeidet.

Verwandte Themen