2014-02-08 82 views
2

我想要創建值的陣列的0.2 一個區間I中使用的代碼:截斷誤差

public class TrialCode { 

public static void main(String[] args) { 

    float a = -1.0f, b = 0.2f; 

    for (int i = 0; i <10; i++) { 
     a = a + b; 
     System.out.println(a); 

    } 

} 

} 

現在,我得到的輸出是:

-0.8 
-0.6 
-0.40000004 
-0.20000003 
-2.9802322E-8 
0.19999997 
0.39999998 
0.59999996 
0.79999995 
0.99999994 

,而我想要的輸出是

-0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1.0 

我該怎麼辦?

+0

相關/可能DUP:http://stackoverflow.com/questions/327544/strange-floating-point-behaviour-in-a-java-program – Krease

回答

5

如果你不想浮點運算,那就不要使用浮點類型。 FloatDouble不是Java核心庫中唯一的非整數Number。你在做什麼要求BigDecimal

import java.math.BigDecimal; 

public class TrialCode { 

    public static void main(String[] args) { 

     BigDecimal a = new BigDecimal("-1.0"); 
     BigDecimal b = new BigDecimal("0.2"); 

     for (int i = 0; i < 10; i++) { 
      a = a.add(b); 
      System.out.println(a); 
     } 
    } 
} 
5

浮點數只能達到一定的精度。對於float它是6-7有效數字,對於double它是15-16有效數字。由於二進制表示,簡單的小數部分如0.1不能精確表示。

你能讓輸出得到的結果你想要的:

System.out.printf("%.1f", a); 
+0

我正要回答這個問題。 –

+0

java是否有printf或者它可能是println? – ItayB

+1

@ItayB對[使用格式字符串您需要使用printf](http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html) –

0

您可以使用類似

new DecimalFormat("#.#").format(0.19999997); //"0.2"