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?
java
bigdecimal
Jojo
sumber
sumber
Jawaban:
Gunakan
compareTo(BigDecimal.ZERO)
alih-alihequals()
:Membandingkan dengan
BigDecimal
konstantaBigDecimal.ZERO
menghindari harus membangunnew BigDecimal(0)
setiap eksekusi.FYI,
BigDecimal
juga memiliki konstantaBigDecimal.ONE
danBigDecimal.TEN
untuk kenyamanan Anda.Catatan!
Alasan Anda tidak bisa digunakan
BigDecimal#equals()
adalah bahwa dibutuhkan skala menjadi pertimbangan:jadi tidak cocok untuk perbandingan murni numerik. Namun,
BigDecimal.compareTo()
tidak mempertimbangkan skala saat membandingkan:sumber
Atau, signum () dapat digunakan:
sumber
BigDecimal.ZERO.compareTo(null)
akan melempar NPEAda konstanta yang dapat Anda periksa:
sumber
equals
dancompareTo
tidak seperti yang Anda pikirkan. docs.oracle.com/javase/1.5.0/docs/api/java/math/…Saya biasanya menggunakan yang berikut ini:
sumber
Atau, saya pikir perlu disebutkan bahwa perilaku metode equals dan compareTo di kelas BigDecimal tidak konsisten satu sama lain .
Ini pada dasarnya berarti:
Karena itu, Anda harus sangat berhati-hati dengan skala dalam
someValue
variabel Anda , jika tidak, Anda akan mendapatkan hasil yang tidak terduga.sumber
Anda ingin menggunakan equals () karena mereka adalah objek, dan menggunakan instance ZERO bawaan:
Perhatikan bahwa
.equals()
memperhitungkan skala, jadi kecuali selectPrice memiliki skala yang sama (0).ZERO
maka ini akan mengembalikan false.Untuk menghilangkan skala dari persamaan:
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, sedangkan0
tidak begitu tepat. Tergantung pada situasi yang Anda mungkin ingin pertahankan.equals()
.sumber
equals
dancompareTo
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-alihcompareTo()
. OP tidak menentukan jenis matematika apa yang ia gunakan, jadi Anda benar lebih baik memberinya kedua opsi.GriffeyDog pasti benar:
Kode:
Hasil:
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:
Berikut cara menggunakannya:
Hasilnya terlihat seperti ini:
sumber
Hanya ingin berbagi di sini beberapa ekstensi bermanfaat untuk kotlin
sumber
sumber
Ada konstanta statis yang mewakili 0 :
Anda harus melakukan ini alih-alih:
untuk menghindari kasus di mana
selectPrice
adalahnull
.sumber
equals
dancompareTo
tidak seperti yang Anda pikirkan. docs.oracle.com/javase/1.5.0/docs/api/java/math/…