So sánh nếu BigDecimal lớn hơn 0


244

Làm thế nào tôi có thể so sánh nếu BigDecimalgiá trị lớn hơn 0?


1
nhìn vào github.com/mortezaadi/bigdecimal-utils có một phương thức isPositive () cũng có dạng là (bigdecimal) .isZero (); là (bigdecimal) .notZero (); là (bigdecimal) .isPositive (); // lớn hơn 0 là (bigdecimal) .isNegative (); // nhỏ hơn 0 là (bigdecimal) .isNonPositive (); // nhỏ hơn hoặc bằng 0 là (bigdecimal) .isNonNegative ();
Morteza Adi

@MortezaAdi kể từ khi BigDecimalthực hiện Comparablecác chức năng so sánh như lt, le, eq, netốt hơn được chuyển sang a ComparableUtils. Vì vậy, chúng có thể được sử dụng cho bất kỳ lớp nào khác như Datehoặc các loại tùy chỉnh.
djmj

@djmj yêu cầu xác định việc thực hiện, không cần thiết cũng không có ý định xây dựng so sánhUtils. Bên cạnh chức năng của lt, le, eq, v.v ... hoàn toàn khác so với chung chung.
Morteza Adi

Câu trả lời:


400

Nó đơn giản như:

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

Các tài liệu chocompareTo thực sự quy định cụ thể rằng nó sẽ trở về -1, 0 hoặc 1, nhưng tổng quát hơn Comparable<T>.compareTophương pháp duy nhất đảm bảo nhỏ hơn không, không, hoặc lớn hơn không cho ba trường hợp thích hợp - vì vậy tôi thường chỉ dính vào so sánh đó.


50
Một lời cảnh báo thêm được gọi cho. Giả sử rằng valuecó giá trị bằng 0 nhưng thang đo khác không (ví dụ: nó ước tính 0.00thay vì 0). Bạn có thể muốn xem xét rằng nó bằng không. Các compareTo()phương pháp thực sự sẽ làm điều này. Nhưng equals()phương pháp sẽ không. (Một bằng chứng khác, nếu cần, Loki hoặc một trong những avatar của anh ấy vẫn còn sống và đã chuyển sang phát triển phần mềm.)
Andrew Spencer

9
Mặc dù tôi đồng ý rằng đây là giải pháp thành ngữ trong Java, tôi không nghĩ nó thực sự có thể đọc được. Mỗi lần tôi gặp phải một biểu hiện như thế này, tôi thấy mình đang viết một bài kiểm tra để trấn an bản thân rằng tôi đã hiểu đúng. Có lẽ thực tế là các lớp được thêm gần đây, như LocalDatebao gồm isBeforelà một dấu hiệu cho thấy Oracle cũng cảm thấy như vậy. Điều đó không lý tưởng, nhưng tôi nghĩ rằng trong trường hợp này có thể dễ đọc hơn một chút để viết một isGreaterThanphương thức tiện ích .
Đánh dấu Slater

Liệu giải pháp @Jon Skeet cũng hoạt động nếu giá trị là 0,00 hoặc 0,0
Angelina

1
@Angelina: Chắc chắn tôi mong đợi nó - chắc chắn - những giá trị đó không lớn hơn 0, vì vậy tôi mong đợi được compareTotrả về 0. Nhưng nếu bạn lo lắng, bạn sẽ dễ dàng kiểm tra.
Jon Skeet

@MarkSlater Tôi đồng ý, so sánh chỉ là Java nên đầu tư nhiều thời gian hơn vào việc cải thiện khả năng đọc và thật vô nghĩa nếu mọi người phải tạo ra các phương thức dễ đọc của riêng mình trong mỗi dự án. Trong C #, bạn cũng có thể tạo các phương thức mở rộng cho các lớp hiện có để bạn có thể trực tiếp sử dụng `value.isGTHERThen (foo)` `
djmj

164

Cách tốt hơn có thể :

if (value.signum() > 0)

12
BigDecimal.compareTo () bắt đầu bằng cách so sánh các tín hiệu như là một tối ưu hóa. Vì vậy, có lẽ tốt nhất để gọi so sánh (), vì nó tiết lộ nhiều ý định hơn và chỉ tốn chi phí cho một cuộc gọi phương thức bổ sung (mà tôi nghi ngờ sẽ được đặt nội tuyến).
Andrew Spencer

27
Đây là một phần của API công khai. Vì vậy, với tôi, một cách tốt hơn. ý định IS để xác định xem dấu hiệu đó có tích cực hay không (tức là> KHÔNG)
Marc

Bạn có nghĩ rằng đó là hiệu suất cao hơn nếu nó chỉ lấy ký tự đầu tiên của một Stringkhởi tạo BigDecimalđể xem nó có -hay không? Đó là dự đoán tốt nhất của tôi về cách nó có thể hoạt động. Có vẻ nhanh hơn để thực sự xác định nếu số lượng 0. Điều này có đúng không? Cảm ơn bạn rất nhiều trước Anton Bessonov!

5
Nếu bạn nhìn vào BigDecimal.compareTo()phương thức dịch ngược , bạn sẽ thấy rằng nó gọi signum()hai lần. Vì vậy, theo như hiệu suất, signum()là tốt hơn.
MeIr

1
Vấn đề của bạn với các trường hợp thập phân là gì? @jfajunior
İsmail Yavuz

11

Sử dụng compareTo()chức năng được tích hợp trong lớp.


1

sử dụng phương pháp này an toàn hơn compareTo()

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

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

bảng điều khiển in

    result ==> 1

compareTo() trả lại

  • 1 nếu a lớn hơn b
  • -1 nếu b nhỏ hơn b
  • 0 nếu a bằng b

bây giờ cho vấn đề của bạn, bạn có thể sử dụng

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

hoặc là

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

Tôi hy vọng nó đã giúp bạn.


0

sử dụng ".intValue ()" trên đối tượng BigDecimal là không đúng khi bạn muốn kiểm tra xem vắt của nó có hơn không. Tùy chọn duy nhất còn lại là phương thức ".compareTo ()".


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

Obj giữ chuỗi số, Trong câu trả lời được chấp nhận, giá trị không được khai báo, có thể gây nhầm lẫn. Câu trả lời của tôi sẽ có sự rõ ràng hơn.
Rama Krishna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.