Bandingkan jika BigDecimal lebih besar dari nol

244

Bagaimana saya bisa membandingkan jika BigDecimalnilainya lebih besar dari nol?

Santhosh
sumber
1
lihat ke github.com/mortezaadi/bigdecimal-utils ada metode isPositive () ada juga seperti is (bigdecimal) .isZero (); adalah (bigdecimal) .notZero (); is (bigdecimal) .isPositive (); // lebih besar dari nol adalah (bigdecimal) .isNegative (); // kurang dari nol adalah (bigdecimal) .isNonPositive (); // kurang dari atau sama dengan nol adalah (bigdecimal) .isNonNegative ();
Morteza Adi
@MortezaAdi karena BigDecimalmengimplementasikan Comparablefungsi perbandingan seperti lt, le, eq, nesebaiknya dipindahkan ke a ComparableUtils. Jadi mereka dapat digunakan untuk kelas lain seperti Dateatau tipe khusus.
djmj
Persyaratan @djmj mendefinisikan implementasi, tidak ada kebutuhan atau niat untuk membangun ComparableUtils. Di samping fungsi lt, le, eq, dll sama sekali berbeda dari yang umum.
Morteza Adi

Jawaban:

400

Sesederhana:

if (value.compareTo(BigDecimal.ZERO) > 0)

The dokumentasi untukcompareTo benar-benar menentukan bahwa itu akan kembali -1, 0 atau 1, tetapi lebih umum Comparable<T>.compareTometode hanya menjamin kurang dari nol, nol, atau lebih besar dari nol untuk yang tepat tiga kasus - jadi saya biasanya hanya menempel perbandingan itu.

Jon Skeet
sumber
50
Kata peringatan tambahan diperlukan. Misalkan valuememiliki nilai nol tetapi skala non-nol (misalnya ia mengevaluasi 0.00bukan 0). Anda mungkin ingin mempertimbangkan bahwa itu sama dengan nol. The compareTo()Metode memang akan melakukan hal ini. Tetapi equals()metodenya tidak akan. (Bukti lain, jika ada yang diperlukan, bahwa Loki atau salah satu avatarnya masih hidup dan baik dan telah pindah ke pengembangan perangkat lunak.)
Andrew Spencer
9
Meskipun saya setuju bahwa ini adalah solusi idiomatik di Jawa, saya tidak berpikir itu sebenarnya dapat dibaca. Setiap kali saya menemukan ekspresi seperti ini, saya menemukan diri saya menulis tes untuk meyakinkan diri saya bahwa saya sudah mendapatkannya dengan benar. Mungkin fakta bahwa kelas yang baru ditambahkan, seperti LocalDateinclude isBeforeadalah indikasi bahwa Oracle merasakan hal yang sama. Ini tidak ideal, tetapi saya pikir ini sedikit lebih mudah dibaca dalam keadaan ini untuk menulis isGreaterThanmetode utilitas .
Mark Slater
Apakah solusi @Jon Skeet juga berfungsi jika nilainya 0,00 atau 0,0
Angelina
1
@ Angelina: Saya mengharapkannya, tentu saja - nilai-nilai itu tidak lebih besar dari 0, jadi saya berharap compareTountuk mengembalikan 0. Tapi jika Anda khawatir, seharusnya mudah bagi Anda untuk menguji.
Jon Skeet
@ MarkSlater Saya setuju, yang membandingkan Java hanya harus menginvestasikan lebih banyak waktu dalam meningkatkan keterbacaan dan tidak masuk akal jika setiap orang harus membuat metode sendiri yang dapat dibaca di setiap proyek. Dalam C # Anda juga dapat membuat metode ekstensi untuk kelas yang ada sehingga Anda dapat langsung menggunakan `value.isGreaterThen (foo)` `
djmj
164

Kemungkinan cara yang lebih baik :

if (value.signum() > 0)
Anton Bessonov
sumber
12
BigDecimal.compareTo () dimulai dengan membandingkan signum sebagai pengoptimalan. Jadi mungkin lebih baik untuk memanggil compareTo (), karena lebih mengungkap maksud dan hanya biaya harga panggilan metode tambahan (yang saya curigai akan mendapatkan inline pula).
Andrew Spencer
27
Ini adalah bagian dari API publik. jadi, bagi saya, cara yang lebih baik. niatnya adalah untuk menentukan apakah tanda itu positif (yaitu> NOL)
Marc
Apakah Anda pikir itu kinerja yang lebih tinggi jika hanya mengambil karakter pertama dari yang Stringdiinisialisasi BigDecimaluntuk melihat apakah itu -atau tidak? Itu tebakan terbaik saya tentang cara kerjanya. Tampaknya lebih cepat untuk benar-benar menentukan apakah angkanya 0. Apakah ini benar? Terima kasih banyak sebelumnya. Anton Bessonov!
5
Jika Anda melihat BigDecimal.compareTo()metode dekompilasi , Anda akan menemukan bahwa itu memanggil signum()dua kali. Jadi sejauh kinerja berjalan, signum()lebih baik.
MeIr
1
Apa masalah Anda dengan kasus desimal? @jfajunior
İsmail Yavuz
11

Gunakan compareTo()fungsi yang dibangun ke dalam kelas.

Duffymo
sumber
1

lebih aman menggunakan metode ini compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

cetak konsol

    result ==> 1

compareTo() kembali

  • 1 jika a lebih besar dari b
  • -1 jika b kurang dari b
  • 0 jika a sama dengan b

sekarang untuk masalah Anda, Anda dapat menggunakan

if (value.compareTo(BigDecimal.ZERO) > 0)

atau

if (value.compareTo(new BigDecimal(0)) > 0)

Saya harap ini membantu Anda.

yoshi
sumber
0

menggunakan ".intValue ()" pada objek BigDecimal tidak benar ketika Anda ingin memeriksa apakah parutannya dari nol. Satu-satunya pilihan yang tersisa adalah metode ".compareTo ()".

Satya M
sumber
-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");
Rama Krishna
sumber
Keberatan memegang string numarik, Dalam jawaban yang diterima nilai tidak dinyatakan, mungkin membingungkan. Jawaban saya akan lebih jelas.
Rama Krishna