Tôi có đoạn mã sau trong Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Cách tốt nhất để viết điều kiện if là gì?
Tôi có đoạn mã sau trong Java;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Cách tốt nhất để viết điều kiện if là gì?
Câu trả lời:
Sử dụng compareTo(BigDecimal.ZERO)
thay vì equals()
:
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
So sánh với BigDecimal
hằng số BigDecimal.ZERO
tránh phải xây dựng một new BigDecimal(0)
thực thi.
FYI, BigDecimal
cũng có hằng số BigDecimal.ONE
và BigDecimal.TEN
để thuận tiện cho bạn.
Lý do bạn không thể sử dụng BigDecimal#equals()
là nó có quy mô xem xét:
new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!
vì vậy nó không phù hợp để so sánh hoàn toàn bằng số. Tuy nhiên, BigDecimal.compareTo()
không xem xét quy mô khi so sánh:
new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
Ngoài ra, Signum () có thể được sử dụng:
if (price.signum() == 0) {
return true;
}
BigDecimal.ZERO.compareTo(null)
sẽ ném NPE
Có một hằng số mà bạn có thể kiểm tra lại:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equals
và compareTo
không như bạn nghĩ. docs.oracle.com/javase/1.5.0/docs/api/java/math/ory
Ngoài ra, tôi nghĩ điều đáng nói là hành vi của các phương thức bằng và so sánh trong lớp BigDecimal không nhất quán với nhau .
Điều này về cơ bản có nghĩa là:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false
Do đó, bạn phải rất cẩn thận với thang đo trong someValue
biến của mình , nếu không bạn sẽ nhận được kết quả bất ngờ.
Bạn sẽ muốn sử dụng bằng () vì chúng là các đối tượng và sử dụng thể hiện ZERO tích hợp:
if(selectPrice.equals(BigDecimal.ZERO))
Lưu ý rằng .equals()
sẽ tính tỷ lệ, vì vậy trừ khi selectprice có cùng tỷ lệ (0) .ZERO
thì điều này sẽ trả về false.
Để lấy quy mô ra khỏi phương trình như sau:
if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
Tôi nên lưu ý rằng đối với các tình huống toán học nhất định 0.00 != 0
, đó là lý do tại sao tôi tưởng tượng .equals()
sẽ tính đến quy mô. 0.00
đưa ra độ chính xác cho vị trí thứ một trăm, trong khi đó 0
không chính xác. Tùy thuộc vào tình huống mà bạn có thể muốn gắn bó .equals()
.
equals
và compareTo
không như bạn nghĩ. docs.oracle.com/javase/1.5.0/docs/api/java/math/ory
equals
có quy mô vào tài khoản, đó không phải là những gì chúng ta muốn ở đây.
equals
nên được sử dụng thay vì compareTo()
. OP không chỉ định loại toán học mà anh ta đang sử dụng, vì vậy bạn nói đúng hơn là cung cấp cho anh ta cả hai tùy chọn.
GriffeyDog hoàn toàn chính xác:
Mã số:
BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));
Các kết quả:
myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
equals=false
compare=true
Mặc dù tôi hiểu các ưu điểm của so sánh BigDecimal, tôi sẽ không coi đó là một cấu trúc trực quan (như các toán tử ==, <,>, <=,> =). Khi bạn đang giữ một triệu thứ (ok, bảy thứ) trong đầu, thì bất cứ điều gì bạn có thể giảm tải nhận thức là một điều tốt. Vì vậy, tôi đã xây dựng một số chức năng tiện lợi hữu ích:
public static boolean equalsZero(BigDecimal x) {
return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) >= 0);
}
Đây là cách sử dụng chúng:
System.out.println("Starting main Utils");
BigDecimal bigDecimal0 = new BigDecimal(00000.00);
BigDecimal bigDecimal2 = new BigDecimal(2);
BigDecimal bigDecimal4 = new BigDecimal(4);
BigDecimal bigDecimal20 = new BigDecimal(2.000);
System.out.println("Positive cases:");
System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
System.out.println("bigDecimal2=" + bigDecimal2 + " < bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " > bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
System.out.println("Negative cases:");
System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " < bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " > bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));
Các kết quả trông như thế này:
Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 < bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 > bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 < bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 > bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
Có một hằng số tĩnh đại diện cho 0 :
BigDecimal.ZERO.equals(selectPrice)
Bạn nên làm điều này thay vì:
selectPrice.equals(BigDecimal.ZERO)
để tránh trường hợp selectPrice
là null
.
equals
và compareTo
không như bạn nghĩ. docs.oracle.com/javase/1.5.0/docs/api/java/math/ory