BigDecimal sıfırdan büyükse karşılaştır


245

BigDecimalDeğer sıfırdan büyükse nasıl karşılaştırabilirim ?


1
github.com/mortezaadi/bigdecimal-utils içine bakmak isPositive () yöntemi de var (bigdecimal) .isZero (); (BigDecimal) .notZero () 'i; (BigDecimal) .isPositive () 'i; // sıfırdan büyük (bigdecimal) .isNegative (); // sıfırdan küçük (bigdecimal). isNonPositive (); // sıfırdan küçük veya eşittir (bigdecimal) .isNonNegative ();
Morteza Adi

@MortezaAdi daha iyi gibi karşılaştırma fonksiyonları BigDecimaluygular a . Bu nedenle, özel türler gibi diğer sınıflar için kullanılabilirler . Comparablelt, le, eq, neComparableUtilsDate
djmj

@djmj gereksinimleri uygulamayı tanımlar, ComparableUtils oluşturmaya gerek yoktu. Lt, le, eq, vb. Fonksiyonelliğinin yanında genel olandan tamamen farklıdır.
Morteza Adi

Yanıtlar:


401

Bu kadar basit:

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

BelgelericompareTo geri gelme aslında belirttiğinden -1, 0 veya 1 ama daha genel Comparable<T>.compareToyöntem yalnızca sıfırdan küçük garanti, sıfır veya uygun üç durum için sıfırdan büyük - Ben genellikle sadece bu karşılaştırma sopa böylece.


50
Fazladan bir uyarı çağrısı yapılır. Varsayalım valuedeğeri sıfır, ancak sıfır olmayan bir ölçek (örneğin, 0.00yerine değerlendirir 0). Muhtemelen sıfıra eşit olduğunu düşünmek istersiniz. compareTo()Yöntem gerçekten yapacağız. Ancak equals()yöntem olmayacak. (Gerekirse, Loki veya avatarlarından birinin canlı ve iyi olduğunu ve yazılım geliştirmeye geçtiğini gösteren başka bir kanıt.)
Andrew Spencer

9
Bunun Java'daki deyimsel çözüm olduğunu kabul etsem de, aslında okunabilir olduğunu sanmıyorum. Böyle bir ifadeyle her karşılaştığımda, kendime doğru yolu bulduğuma güvence vermek için bir test yazdım. Belki de yakın zamanda eklenen sınıfların LocalDatedahil isBeforeolması, Oracle'ın da aynı şekilde hissettiğinin bir göstergesidir. İdeal değil, ama bence bu koşullarda bir faydalı isGreaterThanyöntem yazmak marjinal olarak daha okunabilir .
Mark Slater

@Jon Skeet çözümü, değer 0.00 veya 0.0 ise de işe yarar mı
Angelina

1
@Angelina: Kesinlikle bekliyordum - bu değerler 0'dan büyük değil , bu yüzden compareTo0'a dönmeyi beklerdim . Ama endişeleniyorsanız test etmeniz kolay olmalı.
Jon Skeet

@MarkSlater Kabul ediyorum, CompareTo sadece Java okunabilirliği geliştirmek için daha fazla zaman harcamalı ve herkesin her projede kendi okunabilir yöntemlerini yaratması gerekmiyorsa mantıklı değil. C # 'da varolan sınıflar için genişletme yöntemleri de oluşturabilirsiniz, böylece doğrudan `value.isGreaterThen (foo)` `
djmj

165

Olası daha iyi bir yol :

if (value.signum() > 0)

12
BigDecimal.compareTo (), oturumları bir optimizasyon olarak karşılaştırarak başlar. Bu yüzden muhtemelen daha iyi niyet açıklayıcı ve sadece ekstra bir yöntem çağrısının maliyetine mal olduğu için CompareTo () çağırmak en iyisidir (ki yine de inline alacağından şüpheleniyorum).
Andrew Spencer

27
Bu, herkese açık API'nın bir parçasıdır. benim için daha iyi bir yol. niyet, işaretin pozitif olup olmadığını tespit etmektir (örn.> SIFIR)
Marc

Bir Stringbaşlangıcın ilk karakterini BigDecimalalıp almadığını görmek için daha yüksek performans olduğunu düşünüyor musunuz -? Bu nasıl çalışabileceğine dair en iyi tahminim. Sayının gerçekten olup olmadığını belirlemek için daha hızlı görünüyor 0. Bu doğru mu? Şimdiden çok teşekkür ederim Anton Bessonov!

5
Ayrıştırılmış BigDecimal.compareTo()yönteme bakarsanız, bunun signum()iki kez çağırdığını göreceksiniz . Performansa gelince, signum()daha iyi.
Meir

1
Ondalık vakalarla ilgili sorununuz neydi? @jfajunior
İsmail Yavuz


1

yöntemi kullanmak daha güvenlidir compareTo()

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

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

konsol baskısı

    result ==> 1

compareTo() İadeler

  • 1 , a b'den büyükse
  • -1 b b'den küçükse -1
  • A, b'ye eşitse 0

şimdi problemin için kullanabilirsin

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

veya

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

Umarım size yardımcı olmuştur.


0

BigDecimal nesnesinde ".intValue ()" kullanmak sıfırdan daha büyük olup olmadığını kontrol etmek istediğinizde doğru değildir. Kalan tek seçenek ".compareTo ()" yöntemidir.


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

Obj, sayısal bir dize tutar, Kabul edilen cevapta değer beyan edilmez, kafa karıştırıcı olabilir. Cevabım daha net olacak.
Rama Krishna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.