Pertimbangkan kelas tes sederhana:
import java.math.BigDecimal;
/**
* @author The Elite Gentleman
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal x = new BigDecimal("1");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y));
System.out.println(x.compareTo(y) == 0 ? "true": "false");
}
}
Anda dapat (secara sadar) mengatakan bahwa x
itu sama dengan y
(bukan referensi objek), tetapi ketika Anda menjalankan program, hasil berikut menunjukkan:
false
true
Pertanyaan: Apa perbedaan antara compareTo()
dan equals()
di dalam BigDecimal
yang compareTo
dapat menentukan yang x
sama dengan y
?
PS: Saya melihat bahwa BigDecimal memiliki inflate()
metode equals()
metode. Sebenarnya apa yang inflate()
dilakukan?
java
equals
bigdecimal
compareto
Buhake Sindi
sumber
sumber
inflate()
: ini bukan bagian dari API publik karena hanya memanipulasi representasi internal dan tidak memiliki efek yang terlihat ke "luar". Jadi, kecuali Anda benar-benar ingin mempelajari implementasiBigDecimal
mendalam, saya sarankan Anda mengabaikan metode ini.Jawaban:
Jawabannya ada di JavaDoc dari
equals()
metode :Dengan kata lain:
equals()
memeriksa apakahBigDecimal
objek sama persis di setiap aspek.compareTo()
"hanya" membandingkan nilai numerik mereka.Seperti mengapa
equals()
berperilaku seperti ini, ini telah dijawab dalam pertanyaan SO ini .sumber
BigDecimal
jika Anda tidak membaca JavaDoc dengan cermat. :) - Kami mendapat beberapa bug aneh dari ini sampai kami menyadari perbedaannya.BigDecimal
adalah satu hal seperti itu. Karena itu kita harus selalu memeriksa JavaDoc. Setidaknya sekali Anda mengetahui sesuatu yang aneh sedang terjadi.Pada dasarnya,
inflate()
panggilanBigInteger.valueOf(intCompact)
jika perlu, yaitu menciptakan nilai yang tidak dihitung yang disimpan sebagaiBigInteger
darilong intCompact
. Jika Anda tidak membutuhkannyaBigInteger
dan nilai unscaled cocok denganlong
BigDecimal
tampaknya mencoba menghemat ruang selama mungkin.sumber
BigDecimal
menyimpan nilai yang tidak berskala dalamlong
aBigInteger
. JikaBigInteger
tidak diperlukan secara internal, itu tidak dibuat tetapi jika diperlukan (misalnya ketikaequals
menghadapi inflasi yang meningkat dan yang tidak meningkatBigDecimal)
() `digunakan untuk membuatnya - Singkatnya:inflate()
menangani konversi internal jika perlu dan karena itu bersifat pribadi, seharusnya tidak masalah bagi pengguna kelasSaya percaya bahwa jawaban yang benar adalah membuat dua angka (BigDecimals), memiliki skala yang sama, maka kita dapat memutuskan tentang kesetaraan mereka. Sebagai contoh, apakah kedua angka ini sama?
Yah, itu tergantung pada skalanya. Pada skala 5 (5 poin desimal), tidak ada mereka tidak sama. tetapi pada precimal desimal yang lebih kecil (skala 4 dan lebih rendah) mereka dianggap sama. Jadi saya sarankan untuk membuat skala kedua angka sama dan kemudian membandingkannya.
sumber
Anda juga dapat membandingkan dengan nilai ganda
sumber