Ich habe den folgenden Code in Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Was ist der beste Weg, um die if-Bedingung zu schreiben?
java
bigdecimal
JoJo
quelle
quelle
Antworten:
Verwenden Sie
compareTo(BigDecimal.ZERO)
anstelle vonequals()
:Durch den Vergleich mit der
BigDecimal
Konstante wirdBigDecimal.ZERO
vermieden, dass a konstruiert werden mussnew BigDecimal(0)
jeder Ausführung.Zu Ihrer Information,
BigDecimal
hat auch KonstantenBigDecimal.ONE
undBigDecimal.TEN
Ihrer für Ihre Bequemlichkeit.Hinweis!
Der Grund, den Sie nicht verwenden können,
BigDecimal#equals()
ist, dass die Skalierung berücksichtigt wird:Daher ist es für einen rein numerischen Vergleich ungeeignet. Allerdings
BigDecimal.compareTo()
ist nicht der Maßstab beim Vergleich:quelle
Alternativ kann signum () verwendet werden:
quelle
BigDecimal.ZERO.compareTo(null)
wird NPEEs gibt eine Konstante, gegen die Sie prüfen können:
quelle
equals
undcompareTo
ist nicht so, wie Sie denken. docs.oracle.com/javase/1.5.0/docs/api/java/math/…Ich benutze normalerweise Folgendes:
quelle
Alternativ halte ich es für erwähnenswert, dass das Verhalten von equals- und compareTo-Methoden in der Klasse BigDecimal nicht miteinander übereinstimmt .
Dies bedeutet im Grunde:
Daher müssen Sie mit der Skalierung in Ihrer
someValue
Variablen sehr vorsichtig sein , da Sie sonst ein unerwartetes Ergebnis erhalten.quelle
Sie möchten equals () verwenden, da es sich um Objekte handelt, und die integrierte ZERO-Instanz verwenden:
Beachten Sie, dass
.equals()
die Skalierung berücksichtigt wird, es sei denn, selectPrice hat dieselbe Skalierung (0) wie.ZERO
diese hat, wird false zurückgegeben.Um die Gleichung sozusagen aus der Gleichung herauszunehmen:
Ich sollte das für bestimmte mathematische Situationen beachten,
0.00 != 0
weshalb ich mir vorstelle,.equals()
die Skala zu berücksichtigen.0.00
gibt dem Hundertstel Platz Präzision, während0
es nicht so genau ist. Abhängig von der Situation möchten Sie vielleicht bleiben.equals()
.quelle
equals
undcompareTo
ist nicht so, wie Sie denken. docs.oracle.com/javase/1.5.0/docs/api/java/math/…equals
berücksichtigt die Skalierung, was wir hier nicht wollen.equals
sollte statt verwendet werdencompareTo()
. Das OP gibt nicht an, welche Art von Mathematik er verwendet. Sie haben also Recht, es ist besser, ihm beide Optionen zu geben.GriffeyDog ist definitiv richtig:
Code:
Ergebnisse:
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 (ok, sieben Dinge) in Ihrem Kopf halten, ist alles, was Sie Ihre kognitive Belastung reduzieren können, eine gute Sache. Also habe ich einige nützliche Komfortfunktionen erstellt:
So verwenden Sie sie:
Die Ergebnisse sehen folgendermaßen aus:
quelle
Ich möchte hier nur einige hilfreiche Erweiterungen für Kotlin veröffentlichen
quelle
quelle
Es gibt eine statische Konstante, die 0 darstellt :
Sie sollten dies tun anstatt:
um den Fall zu vermeiden, wo
selectPrice
istnull
.quelle
equals
undcompareTo
ist nicht so, wie Sie denken. docs.oracle.com/javase/1.5.0/docs/api/java/math/…