Vergleichen Sie, ob BigDecimal größer als Null ist


244

Wie kann ich vergleichen, wenn der BigDecimalWert größer als Null ist?


1
Schauen Sie in github.com/mortezaadi/bigdecimal-utils. Es gibt eine Methode. IsPositive () gibt es auch wie is (bigdecimal) .isZero (). is (bigdecimal) .notZero (); is (bigdecimal) .isPositive (); // größer als Null ist (bigdecimal) .isNegative (); // kleiner als Null ist (bigdecimal) .isNonPositive (); // kleiner oder gleich Null ist (bigdecimal) .isNonNegative ();
Morteza Adi

@MortezaAdi da BigDecimalimplementiert Comparabledie Vergleichsfunktionen wie lt, le, eq, nebesser auf a verschoben werden ComparableUtils. Sie können also für andere Klassen wie Dateoder benutzerdefinierte Typen verwendet werden.
DJJJ

@ djmj Anforderungen definiert die Implementierung, es gab keine Notwendigkeit oder Absicht, ComparableUtils zu erstellen. Neben der Funktionalität von lt unterscheiden sich le, eq usw. völlig von der generischen.
Morteza Adi

Antworten:


400

Es ist so einfach wie:

if (value.compareTo(BigDecimal.ZERO) > 0)

Die Dokumentation für gibtcompareTo tatsächlich an, dass -1, 0 oder 1 zurückgegeben wird, aber die allgemeinere Comparable<T>.compareToMethode garantiert nur für die entsprechenden drei Fälle weniger als Null, Null oder mehr als Null - daher halte ich mich normalerweise nur an diesen Vergleich.


50
Ein zusätzliches Warnwort ist erforderlich. Angenommen, das valuehat einen Wert von Null, aber eine Skala ungleich Null (z. B. wird 0.00anstelle von ausgewertet 0). Sie möchten wahrscheinlich berücksichtigen, dass es gleich Null ist. Die compareTo()Methode wird dies in der Tat tun. Aber die equals()Methode wird nicht. (Ein weiterer Beweis, falls vorhanden, dass Loki oder einer seiner Avatare lebt und gesund ist und in die Softwareentwicklung eingetreten ist.)
Andrew Spencer

9
Ich stimme zwar zu, dass dies die idiomatische Lösung in Java ist, glaube aber nicht, dass sie tatsächlich lesbar ist. Jedes Mal, wenn ich auf einen solchen Ausdruck stoße, schreibe ich einen Test, um mir zu versichern, dass ich ihn richtig verstanden habe. Vielleicht ist die Tatsache, dass kürzlich hinzugefügte Klassen wie LocalDateinclude enthalten, isBeforeein Hinweis darauf, dass Oracle genauso denkt. Es ist nicht ideal, aber ich denke, es ist unter diesen Umständen geringfügig besser lesbar, eine Dienstprogrammmethode zu schreiben isGreaterThan.
Mark Slater

Funktioniert die @ Jon Skeet-Lösung auch, wenn der Wert 0,00 oder 0,0 beträgt
Angelina

1
@Angelina: Ich würde es sicherlich erwarten - diese Werte sind nicht größer als 0, also würde ich erwarten compareTo, 0 zurückzugeben. Aber wenn Sie sich Sorgen machen, sollte es für Sie leicht zu testen sein.
Jon Skeet

@MarkSlater Ich stimme zu, das compareTo ist nur, dass Java mehr Zeit in die Verbesserung der Lesbarkeit investieren sollte und es keinen Sinn macht, wenn jeder in jedem Projekt seine eigenen lesbaren Methoden erstellen muss. In C # können Sie auch Erweiterungsmethoden für vorhandene Klassen erstellen, sodass Sie `value.isGreaterThen (foo)` `
djmj

164

Möglicher besserer Weg :

if (value.signum() > 0)

12
BigDecimal.compareTo () vergleicht zunächst die Signale als Optimierung. Daher ist es wahrscheinlich am besten, compareTo () aufzurufen, da es aufschlussreicher ist und nur den Preis eines zusätzlichen Methodenaufrufs kostet (von dem ich vermute, dass er sowieso inline wird).
Andrew Spencer

27
Dies ist Teil der öffentlichen API. Für mich ist es also ein besserer Weg. Die Absicht ist zu bestimmen, ob das Vorzeichen positiv ist (dh> NULL)
Marc

Denken Sie, dass es eine höhere Leistung ist, wenn nur das erste Zeichen einer StringInitialisierung erfasst wird BigDecimal, um festzustellen , ob dies der Fall ist -oder nicht? Das ist meine beste Vermutung, wie es funktionieren könnte. Scheint schneller zu sein, um tatsächlich festzustellen, ob die Nummer ist 0. Ist das richtig? Vielen Dank im Voraus Anton Bessonov!

5
Wenn Sie sich die dekompilierte BigDecimal.compareTo()Methode ansehen , werden Sie feststellen, dass sie signum()zweimal aufgerufen wird . Was die Leistung angeht, signum()ist es besser.
MeIr

1
Was war Ihr Problem mit Dezimalstellen? @jfajunior
İsmail Yavuz

11

Verwenden Sie compareTo()eine in die Klasse integrierte Funktion.


1

Es ist sicherer, die Methode zu verwenden compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

Konsolendruck

    result ==> 1

compareTo() kehrt zurück

  • 1 wenn a größer als b ist
  • -1 wenn b kleiner als b ist
  • 0, wenn a gleich b ist

Jetzt können Sie für Ihr Problem verwenden

if (value.compareTo(BigDecimal.ZERO) > 0)

oder

if (value.compareTo(new BigDecimal(0)) > 0)

Ich hoffe es hat dir geholfen.


0

Die Verwendung von ".intValue ()" für ein BigDecimal-Objekt ist nicht richtig, wenn Sie überprüfen möchten, ob es größer als Null ist. Die einzige verbleibende Option ist die Methode ".compareTo ()".


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

Das Objekt enthält eine numerische Zeichenfolge. In der akzeptierten Antwort wird der Wert nicht deklariert, was möglicherweise verwirrend ist. Meine Antwort wird klarer sein.
Rama Krishna
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.