Saya memiliki kode berikut di Jawa;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Apa cara terbaik untuk menulis kondisi if?
Saya memiliki kode berikut di Jawa;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Apa cara terbaik untuk menulis kondisi if?
Jawaban:
Gunakan compareTo(BigDecimal.ZERO)
alih-alih equals()
:
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
Membandingkan dengan BigDecimal
konstanta BigDecimal.ZERO
menghindari harus membangun new BigDecimal(0)
setiap eksekusi.
FYI, BigDecimal
juga memiliki konstanta BigDecimal.ONE
dan BigDecimal.TEN
untuk kenyamanan Anda.
Alasan Anda tidak bisa digunakan BigDecimal#equals()
adalah bahwa dibutuhkan skala menjadi pertimbangan:
new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!
jadi tidak cocok untuk perbandingan murni numerik. Namun, BigDecimal.compareTo()
tidak mempertimbangkan skala saat membandingkan:
new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
Atau, signum () dapat digunakan:
if (price.signum() == 0) {
return true;
}
BigDecimal.ZERO.compareTo(null)
akan melempar NPE
Ada konstanta yang dapat Anda periksa:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equals
dan compareTo
tidak seperti yang Anda pikirkan. docs.oracle.com/javase/1.5.0/docs/api/java/math/…
Atau, saya pikir perlu disebutkan bahwa perilaku metode equals dan compareTo di kelas BigDecimal tidak konsisten satu sama lain .
Ini pada dasarnya berarti:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false
Karena itu, Anda harus sangat berhati-hati dengan skala dalam someValue
variabel Anda , jika tidak, Anda akan mendapatkan hasil yang tidak terduga.
Anda ingin menggunakan equals () karena mereka adalah objek, dan menggunakan instance ZERO bawaan:
if(selectPrice.equals(BigDecimal.ZERO))
Perhatikan bahwa .equals()
memperhitungkan skala, jadi kecuali selectPrice memiliki skala yang sama (0).ZERO
maka ini akan mengembalikan false.
Untuk menghilangkan skala dari persamaan:
if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
Saya harus mencatat bahwa untuk situasi matematika tertentu 0.00 != 0
, itulah sebabnya saya bayangkan .equals()
memperhitungkan skala. 0.00
memberikan ketepatan ke tempat seratus, sedangkan 0
tidak begitu tepat. Tergantung pada situasi yang Anda mungkin ingin pertahankan .equals()
.
equals
dan compareTo
tidak seperti yang Anda pikirkan. docs.oracle.com/javase/1.5.0/docs/api/java/math/…
equals
mempertimbangkan skala, yang bukan yang kita inginkan di sini.
equals
harus digunakan alih-alih compareTo()
. OP tidak menentukan jenis matematika apa yang ia gunakan, jadi Anda benar lebih baik memberinya kedua opsi.
GriffeyDog pasti benar:
Kode:
BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));
Hasil:
myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
equals=false
compare=true
Sementara saya memahami keuntungan dari perbandingan BigDecimal, saya tidak akan menganggapnya sebagai konstruksi intuitif (seperti operator ==, <,>, <=,> =). Ketika Anda memegang sejuta hal (ok, tujuh hal) di kepala Anda, maka apa pun yang Anda dapat mengurangi beban kognitif Anda adalah hal yang baik. Jadi saya membangun beberapa fungsi kenyamanan yang bermanfaat:
public static boolean equalsZero(BigDecimal x) {
return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) >= 0);
}
Berikut cara menggunakannya:
System.out.println("Starting main Utils");
BigDecimal bigDecimal0 = new BigDecimal(00000.00);
BigDecimal bigDecimal2 = new BigDecimal(2);
BigDecimal bigDecimal4 = new BigDecimal(4);
BigDecimal bigDecimal20 = new BigDecimal(2.000);
System.out.println("Positive cases:");
System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
System.out.println("bigDecimal2=" + bigDecimal2 + " < bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " > bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
System.out.println("Negative cases:");
System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " < bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " > bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));
Hasilnya terlihat seperti ini:
Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 < bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 > bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 < bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 > bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
Ada konstanta statis yang mewakili 0 :
BigDecimal.ZERO.equals(selectPrice)
Anda harus melakukan ini alih-alih:
selectPrice.equals(BigDecimal.ZERO)
untuk menghindari kasus di mana selectPrice
adalah null
.
equals
dan compareTo
tidak seperti yang Anda pikirkan. docs.oracle.com/javase/1.5.0/docs/api/java/math/…