BigDecimal'de>, =, <gibi karşılaştırma operatörleri nasıl kullanılır?


105

UnitPrice değeri BigDecimal veri türü olarak ayarlanmış bir etki alanı sınıfım var. Şimdi fiyatı karşılaştırmak için bir yöntem oluşturmaya çalışıyorum ancak BigDecimal veri türünde karşılaştırma operatörlerine sahip olamıyorum gibi görünüyor. Veri türünü değiştirmem gerekiyor mu yoksa bunun başka bir yolu var mı?


çünkü BigDecimalbir Object, hayır bu işe yaramıyor. Ama sadece her biri diğerinden çıkarma ve elde edilen değer ise kontrol edebilir <0, ==0ya da >0. Aksi takdirde, BigDecimal
SomeJavaGuy'dan

2
Bu yüzden compareTo-1, 0 veya 1'i döndüren bir yöntem vardır Comparable. Temelde .
M.Deinum

Yanıtlar:


115

Sınıfın her nesnesinin, onu başka bir BigDecimal ile karşılaştırmak için kullanabileceğiniz BigDecimalbir yöntemi vardır compareTo. Sonucu compareTodaha sonra karşılaştırılır > 0, == 0ya < 0neye ihtiyacınız bağlı. Belgeleri okuyun ve öğreneceksiniz.

Operatörler ==, <, >ve bu yüzden sadece gibi temel veri tipleri üzerinde kullanılabilir int, long, doublebunların sarıcı gibi sınıf veya Integerve Double.

Belgelerden compareTo:

Bunu BigDecimalbelirtilen ile karşılaştırır BigDecimal.

BigDecimal Değer olarak eşit olan ancak farklı bir ölçeğe sahip (2.0 ve 2.00 gibi) iki nesne bu yöntemle eşit kabul edilir. Bu yöntem, altı boolean karşılaştırma operatörünün (<, ==,>,> =,! =, <=) Her biri için ayrı yöntemlere tercih edilerek sağlanır. Bu karşılaştırmaları yapmak için önerilen deyim şudur: (x.compareTo(y) <op> 0)Burada <op> , altı karşılaştırma operatöründen biridir.

Şunu döndürür: Bu BigDecimal sayısal olarak val'den küçük, ona eşit veya büyük olduğundan -1, 0 veya 1.


1
Ancak CompareTo yöntemi, fiyatın şundan yüksek, şuna eşit veya daha düşük olup olmadığını bulmaya yardımcı olur mu?
user3127109

2
Evet. Bu bilgi cevapta verilen bağlantıdadır.
Drew Kennedy

4
@ user3127109 evet, a.compareTo(b)if a > b, 0if sıfırdan büyük a == bve if sıfırdan küçük bir sayı döndürür a < b.
Zoltán

121

Kısa olmak gerekirse:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    

22

compareToBigDecimal yöntemini kullanın :

public int CompareTo (BigDecimal val) Bu BigDecimal'i belirtilen BigDecimal ile karşılaştırır.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

12

compareTo, Adlı yöntemi kullanabilirsiniz x.compareTo(y). X ve y eşitse 0, x y'den büyükse 1 ve x y'den küçükse -1 döndürür.


11

İşte altı boole karşılaştırma operatörünün tümü için bir örnek (<, ==,>,> =,! =, <=):

BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);

System.out.println(big10.compareTo(big20) < -1);  // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1);  // false
System.out.println(big10.compareTo(big20) != -1); // false

System.out.println(big10.compareTo(big20) < 0);   // true
System.out.println(big10.compareTo(big20) <= 0);  // true
System.out.println(big10.compareTo(big20) == 0);  // false
System.out.println(big10.compareTo(big20) >= 0);  // false
System.out.println(big10.compareTo(big20) > 0);   // false
System.out.println(big10.compareTo(big20) != 0);  // true

System.out.println(big10.compareTo(big20) < 1);   // true
System.out.println(big10.compareTo(big20) <= 1);  // true
System.out.println(big10.compareTo(big20) == 1);  // false
System.out.println(big10.compareTo(big20) >= 1);  // false
System.out.println(big10.compareTo(big20) > 1);   // false
System.out.println(big10.compareTo(big20) != 1);  // true

5

BigDecimalEğer kullanamaması için, ilkel değildir <, >operatörler. Ancak, bir Comparableolduğu compareTo(BigDecimal)için, aynı etkiye sahip olabilirsiniz. Örneğin:

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}

0

IBM'in com.ibm.etools.marshall.util.BigDecimalRange kullanım sınıfını kullanarak , aralık içinde BigDecimal ise karşılaştırılabilir .

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);

0

Bu iş parçacığı, BigDecimal örneklerini karşılaştırmak için BigDecimal.compareTo (BigDecimal) yönteminin kullanılacağını belirten birçok yanıt içerir . BigDecimal örneklerinizi nasıl oluşturduğunuza dikkat etmek için BigDecimal.compareTo (BigDecimal) yöntemini kullanma konusunda artık deneyimsiz olanları eklemek istedim . Yani mesela...

  • new BigDecimal(0.8)tam olarak olmayanBigDecimal bir değere sahip bir örnek oluşturacak0.8 ve 50 + bir ölçek olan,
  • new BigDecimal("0.8")Bir yaratacak BigDecimalbir değerle örneği olan tam olarak 0.8ve 1 ölçek vardır

... ve ikisi BigDecimal.compareTo'ya (BigDecimal) göre eşitsiz kabul edilecektir. yöntemine göre eşit değildir çünkü ölçek birkaç ondalık basamakla sınırlı olmadığında değerleri eşit değildir.

Her şeyden önce, BigDecimalörneklerinizi BigDecimal(String val)yapıcı BigDecimal.valueOf(double val)yerine yapıcı veya yöntemle oluşturmaya dikkat edin BigDecimal(double val). İkinci olarak, BigDecimal örneklerinin ölçeğini , BigDecimal.setScale (int newScale, RoundingMode roundingMode) yöntemiyle karşılaştırmadan önce sınırlayabileceğinizi unutmayın .

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.