2013-10-04 115 views
-1

好吧,我想這個程序真的很容易。但是,當控制檯顯示x值(顯示在system.out中)時,我得到「當x是1.20000000000002 ....」。 我知道1.1 + 0.1不是1.200000000002,所以我只是想知道在我的語法中是否有錯。如果您決定運行代碼查看,您會立即看到我的問題。 如果有人有任何建議,我將不勝感激!奇怪的十進制輸出

謝謝

public class EulersMethod { 

    public static void main(String[] args) { 
     double x = 1; 
     double y = 1; 
     double h = 0.1; 

     while(x <= 1.4){ 
      System.out.println("When x is " + x + ", y is " + y); 

      y = y + h * (- x - y); 
      x = x + h; 

     } 
    } 
} 
+0

閱讀有關如何浮點電腦完成。 –

+0

[This](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)可能會讓你感興趣。大多數精度問題的答案也是'BigDecimal'類。 – Pshemo

+0

使用2的權力來執行,如0.5,0.25等。並且不要耗盡位。 – doctorlove

回答

3

0.1不能由double型精確表示,因此必須有一些近似/妥協之作。而對於double它通常只有大約16到17位有效數字。這就是爲什麼你無法準確得到1.2

+0

謝謝。似乎很簡單 –

0

如果您願意,可以使用DecimalFormat進行清理。

DecimalFormat format = new DecimalFormat("0.0"); 
String decimalValueAsString = format.format(yourDecimalValue); 

Documentation

你也可以使用十進制格式與RoundingMode和方法setRoundingMode

1

要在我的評論擴大,一些數字可以精確雙打寫的,像1/2,而其他人不能。

0.5 = 1/2 

所以可以準確地寫爲權力的兩個

0.1 = 1/10 = 1/16 + a bit = 1/16 + 1/32 + a bit more... etc 

更多位的總和永遠不能準確的2的冪,所以你得到它可以管理最接近的一次。它可能會超調或欠調。