it-swarm.com.de

Wie überprüfe ich, ob die BigDecimal-Variable in Java ==?

Ich habe den folgenden Code in Java;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

Wie schreibe ich die if-Bedingung am besten?

166
JoJo

Verwenden Sie compareTo(BigDecimal.ZERO) anstelle von equals() :

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

Der Vergleich mit BigDecimal constant BigDecimal.ZERO vermeidet, dass bei jeder Ausführung eine new BigDecimal(0) erstellt werden muss.

Zu Ihrer Information hat BigDecimal auch Konstanten BigDecimal.ONE und BigDecimal.TEN .


Hinweis!

Der Grund, warum Sie BigDecimal#equals() nicht verwenden können, ist, dass scale berücksichtigt wird:

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

daher ist es für einen rein numerischen Vergleich ungeeignet. BigDecimal.compareTo() berücksichtigt beim Vergleichen jedoch nicht die Skalierung:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
365
Bohemian

Alternativ kann signum () verwendet werden:

if (price.signum() == 0) {
    return true;
}
80
kman

Es gibt eine Konstante, gegen die Sie überprüfen können:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0
23
pablochan

Alternativ finde ich es erwähnenswert, dass das Verhalten von equals und compareTo-Methoden in der Klasse BigDecimal nicht miteinander übereinstimmt .

Dies bedeutet im Wesentlichen:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false

Daher müssen Sie mit der Skala in Ihrer Variablen someValue sehr vorsichtig sein, da Sie sonst ein unerwartetes Ergebnis erhalten.

5
Edwin Dalorzo

Ich verwende normalerweise Folgendes:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }
5
gpol

Sie möchten equals () verwenden, da es sich um Objekte handelt, und die integrierte ZERO-Instanz verwenden:

if(selectPrice.equals(BigDecimal.ZERO))

Beachten Sie, dass .equals() die Skalierung berücksichtigt. Wenn selectPrice nicht dieselbe Skalierung (0) wie .ZERO ist, wird False zurückgegeben.

Skalieren aus der Gleichung sozusagen:

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)

Ich sollte beachten, dass für bestimmte mathematische Situationen 0.00 != 0, weshalb ich mir vorstellen kann, dass .equals() die Skala berücksichtigt. 0.00 gibt der Hundertstelstelle Genauigkeit, während 0 nicht so genau ist. Je nach Situation möchten Sie vielleicht bei .equals() bleiben.

4
NominSim

Ich möchte hier nur einige hilfreiche Erweiterungen für Kotlin mitteilen

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0
0
Nokuap

GriffeyDog ist definitiv richtig:

Code:

BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));

Ergebnisse:

myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
 equals=false
compare=true

Obwohl ich die Vorteile des BigDecimal-Vergleichs verstehe, würde ich ihn nicht als intuitives Konstrukt betrachten (wie die Operatoren ==, <,>, <=,> =). Wenn Sie eine Million Dinge (in Ordnung, sieben Dinge) in Ihrem Kopf haben, ist alles, was Sie tun können, um Ihre kognitive Belastung zu verringern, eine gute Sache. Deshalb habe ich einige nützliche Komfortfunktionen erstellt:

public static boolean equalsZero(BigDecimal x) {
    return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
    return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
    return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
    return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) >= 0);
}

So verwenden Sie sie:

    System.out.println("Starting main Utils");
    BigDecimal bigDecimal0 = new BigDecimal(00000.00);
    BigDecimal bigDecimal2 = new BigDecimal(2);
    BigDecimal bigDecimal4 = new BigDecimal(4);  
    BigDecimal bigDecimal20 = new BigDecimal(2.000);
    System.out.println("Positive cases:");
    System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <  bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >  bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
    System.out.println("Negative cases:");
    System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <  bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >  bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));

Die Ergebnisse sehen folgendermaßen aus:

Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 <  bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 >  bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 <  bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 >  bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
0
Tihamer