2013-10-04 74 views
-1

我爲我的課程寫的程序需要一個從0.5到42.9的行以及其他幾行的行。由於雙打不準確的程序計數0.1,直到0.7,然後下一個數字變爲0.799999999而不是8.我有點在代碼糾正這一點。我想說這與Math.abs和EPS有關,但我不確定。任何意見,將不勝感激。在java中用雙打計數

{ 
    System.out.println(" "); 

    final double MAX2 = 43; 

     for (double row = 0.5; row<MAX2; row+=0.1) 
    { 

     System.out.print(row); 
     if(row != MAX2 -1) 
     {System.out.print(","); 

     }//SOP COMMA 
    }//SOP ROW3 
    }//.5,42.9 

最終的結果是

0.5,0.6,0.7,0.7999999999999999,0.8999999999999999,0.9999999999999999,1.0999999999999999,1.2,1.3,1.4000000000000001,1.5000000000000002,1.6000000000000003,1.7000000000000004,1.8000000000000005,1.9000000000000006,2.0000000000000004,2.1000000000000005,2.2000000000000006 ,2.3000000000000007,2.400000000000001,2.500000000000001,2.600000000000001,2.700000000000001,2.800000000000001,2.9000000000000012等

+0

我不明白:你的問題是什麼? – Kon

+2

[每個計算機科學家應該知道的關於浮點運算的知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。您可以使用'BigDecimal'而不是float/double來避免這種行爲。 – Pshemo

+0

如何讓行以.1至42.9的增量計數 – user2805461

回答

0

一個簡單的方法就是使用printf將變量輸出到小數點後1位。

public static void main(String[] args) { 
    System.out.println(" "); 

    final double MAX2 = 43; 

    for (double row = 0.5; row<MAX2; row+=0.1) { 
     System.out.printf("%.1f", row); 
     if(row != MAX2 -1) { 
      System.out.print(","); 
     } 
    } 
} 
0

這是一個迭代問題它與雙打什麼都沒有關係。

您需要一個從5到429的for循環。 在循環內部,通過將循環索引除以10來計算double值。然後使用該double值來計算循環中的任何計算。

不要忘記在分割之前將索引轉換爲double,否則您將得到不產生所需結果的整數除法。