簡體   English   中英

BigDecimal if語句不適用於! 運營商?

[英]BigDecimal if statement does not work with ! operator?

我有兩個BigDecimalsvalue1value2 我想將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM