Cách sử dụng các toán tử so sánh như>, =, <trên BigDecimal


103

Tôi có một lớp miền với unitPrice được đặt là kiểu dữ liệu BigDecimal. Bây giờ tôi đang cố gắng tạo một phương pháp để so sánh giá nhưng có vẻ như tôi không thể có toán tử so sánh trong kiểu dữ liệu BigDecimal. Tôi có phải thay đổi kiểu dữ liệu hay có cách nào khác?


BigDecimallà một Object, không, điều này không hoạt động. Nhưng bạn có thể chỉ cần trừ một số cho nhau và kiểm tra xem giá trị kết quả là <0, ==0hoặc >0. Nếu không, bạn có thể đi theo con đường tiêu chuẩn với các phương pháp được cung cấp từ BigDecimal
SomeJavaGuy

2
Đó là lý do tại sao có một compareTophương thức trả về -1, 0 hoặc 1. Về cơ bản là Comparable.
M. Deinum

Câu trả lời:


113

Mọi đối tượng của Lớp BigDecimalđều có một phương thức compareTomà bạn có thể sử dụng để so sánh nó với một BigDecimal khác. Kết quả của compareTosau đó được so sánh > 0, == 0hoặc < 0tùy thuộc vào những gì bạn cần. Đọc tài liệu và bạn sẽ tìm ra.

Các nhà khai thác ==, <, >và vân vân chỉ có thể được sử dụng trên các kiểu dữ liệu nguyên thủy như int, long, doublehoặc các lớp wrapper của họ như IntegerDouble.

Từ tài liệu của compareTo:

So sánh cái này BigDecimalvới cái được chỉ định BigDecimal.

Hai BigDecimal đối tượng có giá trị bằng nhau nhưng có tỷ lệ khác nhau (như 2.0 và 2.00) được coi là bằng nhau theo phương pháp này. Phương thức này được cung cấp tùy theo các phương thức riêng lẻ cho từng toán tử trong số sáu toán tử so sánh boolean (<, ==,>,> =,! =, <=). Thành ngữ gợi ý để thực hiện các phép so sánh này là (x.compareTo(y) <op> 0):, đâu <op> là một trong sáu toán tử so sánh.

Trả về: -1, 0 hoặc 1 vì BigDecimal này về số nhỏ hơn, bằng hoặc lớn hơn val.


1
Nhưng liệu phương pháp CompareTo có giúp ích trong việc tìm kiếm như liệu giá lớn hơn, bằng hay thấp hơn không?
user3127109

2
Đúng. Thông tin đó có trong liên kết được cung cấp trong câu trả lời.
Drew Kennedy

4
@ user3127109 yes, a.compareTo(b)trả về một số lớn hơn 0 nếu a > b, 0nếu a == b, và nhỏ hơn 0 nếu a < b.
Zoltán

119

Trở nên ngắn:

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

22

Sử dụng compareTophương pháp BigDecimal:

public int so sánhTo (BigDecimal val) So sánh BigDecimal này với BigDecimal được chỉ định.

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

12

Bạn có thể sử dụng phương thức có tên compareTo, x.compareTo(y). Nó sẽ trả về 0 nếu x và y bằng nhau, 1 nếu x lớn hơn y và -1 nếu x nhỏ hơn y


11

Đây là một ví dụ cho tất cả sáu toán tử so sánh boolean (<, ==,>,> =,! =, <=):

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

BigDecimalkhông phải là một nguyên thủy, vì vậy bạn không thể sử dụng <, >khai thác. Tuy nhiên, vì nó là một Comparable, bạn có thể sử dụng compareTo(BigDecimal)cùng một hiệu ứng. Ví dụ:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}

0

Sử dụng lớp sử dụng com.ibm.etools.marshall.util.BigDecimalRange của IBM, người ta có thể so sánh nếu BigDecimal trong phạm vi.

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

0

Chủ đề này có rất nhiều câu trả lời nói rằng phương thức BigDecimal.compareTo (BigDecimal) là phương thức được sử dụng để so sánh các trường hợp BigDecimal . Tôi chỉ muốn thêm vì không có kinh nghiệm sử dụng phương thức BigDecimal.compareTo (BigDecimal) để cẩn thận với cách bạn đang tạo các phiên bản BigDecimal của mình . Ví dụ...

  • new BigDecimal(0.8)sẽ tạo một BigDecimalphiên bản có giá trị không chính xác 0.8và có thang điểm trên 50,
  • new BigDecimal("0.8")sẽ tạo ra một BigDecimalví dụ với một giá trị mà chính xác 0.8và trong đó có một tỷ lệ 1

... và cả hai sẽ được coi là không bằng nhau theo phương pháp BigDecimal.compareTo (BigDecimal) vì giá trị của chúng không bằng nhau khi tỷ lệ không giới hạn ở một vài chữ số thập phân.

Trước hết, hãy cẩn thận tạo các BigDecimalthể hiện của bạn bằng hàm BigDecimal(String val)tạo hoặc BigDecimal.valueOf(double val)phương thức chứ không phải hàm BigDecimal(double val)tạo. Thứ hai, lưu ý rằng bạn có thể giới hạn quy mô của các cá thể BigDecimal trước khi so sánh chúng bằng phương pháp BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.