2014-02-08 7 views
2

Я хочу создать массив значений с интервалом 0,2 я использовал код:Усечение Ошибка при попытке создать массив значений

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

Если вы не хотите, арифметику с плавающей точкой, то не используйте типы с плавающей точкой. Float и Double - не единственные нецелые Number s в ядре Java. То, что вы делаете, вызывает 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" 
Смежные вопросы