2014-02-08 84 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"