2017-08-25 45 views
0
import java.math.BigDecimal; 

public class HelloWorld{ 

    public static void main(String []args){ 
     BigDecimal previousOperationAmount = new BigDecimal(1149.35); 
     Double requestedAmount = 1149.35; 

     if (requestedAmount != previousOperationAmount.doubleValue()) { 
      System.out.println("Hello 1"); 
     } 

     if(!requestedAmount.equals(previousOperationAmount.doubleValue())) { 
      System.out.println("Hello 2"); 
     } 
    } 
} 

比較double值有兩種方法來比較雙值.. 一個與!=運算符和一個與.equals運營商。我明白,.equals是比較好的方法。但在這裏,!=比較也沒有給出任何錯誤。是用==確定性

可以使用!=雙值比較嗎? Is!=檢查確定性的雙重值嗎?

+1

從技術上講,是和不是。是的,可以比較'double'(但不是'Double',因爲具有相同值的兩個'Double'對象不是'Double'對象)與!=相同。但是由於'double'並不是絕對精確的,所以你遇到了很多麻煩,比如比較1.000000000000000001到1.0(這很容易發生)。所以更好的方法包括,例如,使用'Math.abs(double1 - double2)> eps'(對於有用的eps)。 –

+1

'!='是確定性的,就像'equals'一樣。你爲什麼不檢查'Double.equals'的文檔以找出答案? https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#equals-java.lang.Object- –

+0

@FlorianSchaetz你的意思是'Math.abs(double1 - double2)<= eps'檢查平等時,對嗎?否則,'5.01'和'4.13'會通過檢查任何小於'1.0'的eps。 – Shark

回答

3

的差異在documentation明確規定:

注意,在大多數情況下,Double類,d1的兩個實例和 d2d1.equals(d2)true當且僅當

d1.doubleValue() == d2.doubleValue() 

也具有值true。但是,有兩個例外:

  • 如果d1d2都表示Double.NaN,那麼equals方法返回true,即使Double.NaN==Double.NaN有 價值false
  • 如果d1表示+0.0d2表示-0.0, 或者反之亦然,則等於測試具有值false,即使 +0.0==-0.0具有值true
+0

BigDecimal如何拆箱?這會產生什麼效果。你可以考慮到這一點 –

+0

BigDecimal沒有自動取消裝箱的事情。 – shmosel