Ada masalah saat menangani verifikasi jumlah pembayaran dalam dua hari terakhir. Saya menggunakan metode Equals BigDecimal untuk membandingkan apakah kedua jumlah tersebut sama, yang menghasilkan kesalahan dalam jumlah perbandingan (seperti perbandingan antara 3.0 dan 3.00, dll.).
[Catatan: Berikut ini adalah tentang Sun JDK Versi 1.4.2 sebagai contoh. Implementasi versi lain mungkin tidak konsisten, tolong abaikan saja]
Pertama, mari kita lihat metode Equals BigDecimal:
Public Boolean Equals (Object X) {if (! (X Instance dari BigDecimal)) Return False; BigDecimal XDEC = (BigDecimal) X; Return Scale == XDEC.Scale && intval.equals (xdec.intval); }Anda dapat melihat bahwa metode Euquals BigDecimal adalah dengan terlebih dahulu menentukan tipe data yang akan dibandingkan. Jika tipe objek konsisten, itu ditentukan pada saat yang sama apakah akurasi (skala) dan nilai (metode BigInteger's Equals) konsisten.
Faktanya, sudah sangat jelas di Javadoc: "Membandingkan BigDecimal ini dengan objek yang ditentukan untuk kesetaraan. Tidak seperti Compareto, metode ini mempertimbangkan dua objek BigDecimal yang sama hanya jika mereka sama dalam nilai dan skala (dengan demikian 2,0 tidak sama dengan 2,00 jika dibandingkan dengan metode ini)." Saya hanya tidak memperhatikan!
Mari kita lihat metode compareto:
Public int compareto (BigDecimal Val) {/ * Optimization: akan berjalan dengan baik tanpa tiga baris berikutnya */int sigdiff = Signum () - val.signum (); if (sigdiff! = 0) return (Sigdiff> 0? this; arg [1] = val; matchscale (arg); return arg [0] .Intval.comppareto (arg [1] .Intval); } Anda dapat melihat bahwa ada pemrosesan matchScale dalam metode ini, yang berarti mengonversi objek dengan akurasi rendah ke akurasi tinggi, dan kemudian membandingkannya (juga metode compareto Biginteger). Implementasi MatchScale adalah sebagai berikut:
private static void matchScale (bigdecimal [] val) {if (val [0] .scale <val [1] .scale) val [0] = val [0] .setscale (val [1] .scale); else if (val [1] .scale <val [0] .scale) val [1] = val [1] .setscale <val [0] .scale) val [1] = val [1] .setscale (val [0] .Scale) val [1] = val [1] .setscale (val [0] .Scale) val [1] = val [1] .setscale (val [0] .Skale. } Lakukan tes sederhana:
System.out.println (BigDecimal baru ("1.2"). Equals (BigDecimal baru ("1.20")))); // output falsesystem.out.println (BigDecimal baru ("1.2"). Compareto (BigDecimal baru ("1.20")) == 0); // output true Juga memperhatikan bahwa konstruktor besar di atas dilewatkan dalam string. Jika lulus dalam jenis angka, apa yang akan terjadi? Anda dapat mengujinya sendiri dan menganalisis alasannya:
System.out.println (BigDecimal baru ("1.2"). Equals (BigDecimal baru ("1.20")))); // output falsesystem.out.println (BigDecimal baru ("1.2"). Compareto (BigDecimal baru ("1.20")) == 0); // output true system.out.println (BigDecimal baru (1.2) .Equals (BigDecimal baru ("1.20"))); // output apakah itu? System.out.println (BigDecimal baru (1.2) .compareto (BigDecimal baru ("1.20")) == 0); // Apakah outputnya? System.out.println (BigDecimal baru (1.2) .Equals (BigDecimal baru (1.20))); // Apakah outputnya? System.out.println (BigDecimal baru (1.2) .compareto (BigDecimal baru (1.20)) == 0); // Apakah outputnya?Kesimpulan terakhir adalah: untuk perbandingan ukuran BigDecimal, menggunakan metode Equals tidak hanya akan membandingkan ukuran nilai, tetapi juga membandingkan keakuratan kedua objek. Metode CompareTo tidak akan membandingkan keakuratannya, tetapi hanya membandingkan ukuran nilainya.
Akhirnya, saya membenci diri sendiri. Saya telah menggunakan bahasa Java selama bertahun -tahun dan saya bahkan belum menemukan akal sehat dasar!
Artikel di atas secara singkat berbicara tentang perbedaan antara BigDecimal's Equals dan Compareto di Java adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.