[英]BigDecimal if statement does not work with ! operator?
我有兩個BigDecimals
: value1
和value2
。 我想將value1
除以value2
但如果其中之一為零,顯然我不想這樣做。 所以我寫了這個簡單的if語句:
if(!value1.equals(0) && !value2.equals(0)){
divide value1 by value2 blah blah blah
}
由於某種原因,這個if語句不起作用。即使當其中一個值等於零時,該方程式仍會被求值,這給了我一個錯誤,因為我試圖用零除或零。 我知道我可以只使用value1.compareTo(BigDecimal.valueOf(0) == 1
並得到我想要的東西,但我只是好奇為什么我的第一種方法不起作用。
Java將不同類型的對象視為不同的對象。 這意味着即使它們表示等同物,它們也不相同。
BigDecimal的“特殊”之處在於,即使類型相同且值相等,但具有不同的小數位數,它們仍然不是“等於”
Double d = 0.0;
Integer i = 0;
System.out.println(d + " equals " + i + " is " + (d.equals(i)));
BigDecimal bd2 = new BigDecimal("0.00");
BigDecimal bd3 = new BigDecimal("0.000");
System.out.println(bd2 + " equals " + d + " is " + (bd2.equals(d)));
System.out.println(bd2 + " equals " + bd2 + " is " + (bd2.equals(bd2)));
System.out.println(bd2 + " equals " + bd3 + " is " + (bd2.equals(bd3)));
版畫
0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false
解決此問題的方法是使用compareTo來調整比例並為您提供更自然的比較。
System.out.println(bd2 + " compareTo " + BigDecimal.ZERO + " is " + (bd2.compareTo(BigDecimal.ZERO )));
System.out.println(bd3 + " compareTo " + BigDecimal.ZERO + " is " + (bd3.compareTo(BigDecimal.ZERO )));
版畫
0.00 compareTo 0 is 0
0.000 compareTo 0 is 0
這意味着如果您要使用BigDecimal,則需要編寫
if(value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {
就個人而言,我更喜歡使用double
,它更簡單,更快。 唯一的缺點是您必須自己管理舍入。
double div = value1 / value2;
if (0 < div && div < SOME_UPPER_SENSIBLE_LIMIT) {
// division was ok.
System.out.printf("%.4f", div); // print with rounding.
改用它。
if(BigDecimal.ZERO.compareTo(value1) != 0 && BigDecimal.ZERO.compareTo(value2) != 0)
{
....
}
equals
將不起作用。
檢查以下內容: public boolean equals(Object x)
將此BigDecimal與指定的Object比較是否相等。 與compareTo不同,此方法僅在兩個BigDecimal對象的值和比例相等時才認為它們相等(由此方法比較時,2.0不等於2.00)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.