Cara menggunakan operator perbandingan seperti>, =, <di BigDecimal

103

Saya memiliki kelas domain dengan unitPrice yang ditetapkan sebagai tipe data BigDecimal. Sekarang saya mencoba membuat metode untuk membandingkan harga tetapi sepertinya saya tidak dapat memiliki operator perbandingan dalam tipe data BigDecimal. Apakah saya harus mengubah tipe data atau ada cara lain?

pengguna3127109
sumber
karena BigDecimalitu Object, tidak, ini tidak berfungsi. Tapi Anda bisa mengurangi satu sama lain dan memeriksa apakah nilai yang dihasilkan adalah <0, ==0atau >0. Jika tidak, Anda bisa menggunakan cara standar dengan metode yang disediakan dari BigDecimal
SomeJavaGuy
2
Itulah mengapa ada compareTometode yang mengembalikan -1, 0 atau 1. Yang pada dasarnya adalah Comparable.
M. Deinum

Jawaban:

113

Setiap objek Kelas BigDecimalmemiliki metode compareToyang dapat Anda gunakan untuk membandingkannya dengan BigDecimal lainnya. Hasilnya compareTokemudian dibandingkan > 0, == 0atau < 0tergantung apa yang Anda butuhkan. Baca dokumentasi dan Anda akan mengetahuinya.

Operator ==, <, >dan sebagainya hanya dapat digunakan pada tipe data primitif seperti int, long, doubleatau kelas wrapper mereka seperti Integerdan Double.

Dari dokumentasi compareTo:

Bandingkan ini BigDecimaldengan yang ditentukan BigDecimal.

Dua BigDecimal objek yang nilainya sama tetapi memiliki skala yang berbeda (seperti 2.0 dan 2.00) dianggap sama dengan metode ini. Metode ini disediakan dalam preferensi untuk metode individu untuk masing-masing dari enam operator perbandingan boolean (<, ==,>,> =,! =, <=). Idiom yang disarankan untuk melakukan perbandingan ini adalah:, Di (x.compareTo(y) <op> 0)mana <op> salah satu dari enam operator pembanding.

Mengembalikan: -1, 0, atau 1 karena BigDecimal ini secara numerik kurang dari, sama dengan, atau lebih besar dari val.

Tiruan
sumber
1
Tetapi apakah metode bandingkanTo membantu dalam menemukan seperti apakah harga lebih besar dari, sama dengan atau lebih rendah dari?
user3127109
2
Iya. Informasi itu ada di tautan yang disediakan di jawaban.
Drew Kennedy
4
@ user3127109 yes, a.compareTo(b)mengembalikan angka yang lebih besar dari nol if a > b, 0if a == b, dan kurang dari nol if a < b.
Zoltán
119

Singkatnya:

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

Gunakan compareTometode BigDecimal:

public int bandingkanTo (BigDecimal val) Membandingkan BigDecimal ini dengan BigDecimal yang ditentukan.

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

Anda dapat menggunakan metode bernama compareTo, x.compareTo(y). Ini akan mengembalikan 0 jika x dan y sama, 1 jika x lebih besar dari y dan -1 jika x lebih kecil dari y

Agung Setiawan
sumber
11

Berikut adalah contoh untuk keenam operator perbandingan 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
ognjenkl.dll
sumber
5

BigDecimalbukan primitif, jadi Anda tidak bisa menggunakan <, >operator. Namun, karena ini a Comparable, Anda dapat menggunakan compareTo(BigDecimal)untuk efek yang sama. Misalnya:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}
Mureinik
sumber
0

Menggunakan com.ibm.etools.marshall.util.BigDecimalRange util kelas IBM seseorang dapat membandingkan jika BigDecimal dalam jangkauan.

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

Utas ini memiliki banyak jawaban yang menyatakan bahwa metode BigDecimal.compareTo (BigDecimal) adalah yang akan digunakan untuk membandingkan instance BigDecimal . Saya hanya ingin menambahkan lagi yang tidak berpengalaman dengan menggunakan metode BigDecimal.compareTo (BigDecimal) untuk berhati-hati dengan cara Anda membuat instance BigDecimal . Jadi, misalnya ...

  • new BigDecimal(0.8)akan membuat BigDecimalinstance dengan nilai yang tidak persis 0.8dan berskala 50+,
  • new BigDecimal("0.8")akan membuat BigDecimalcontoh dengan nilai yang merupakan persis 0.8dan yang memiliki skala 1

... dan keduanya akan dianggap tidak sama menurut metode BigDecimal.compareTo (BigDecimal) karena nilainya tidak sama ketika skala tidak terbatas pada beberapa tempat desimal.

Pertama-tama, berhati-hatilah untuk membuat BigDecimalinstance Anda dengan BigDecimal(String val)konstruktor atau BigDecimal.valueOf(double val)metode daripada BigDecimal(double val)konstruktor. Kedua, perhatikan bahwa Anda dapat membatasi skala instance BigDecimal sebelum membandingkannya menggunakan metode BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

Adil Hussain
sumber