2014-02-08 2 views
2

내가 코드를 사용하는 0.2 의 간격으로 값의 배열을 생성 할잘림 오류가

-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

: http://stackoverflow.com/questions/327544/strange-floating-point-behaviour-in-a-java-program – Krease

답변

5

같은 것을 사용할 수있는 부동 소수점 연산을하지 않으려면, 다음하지 않습니다 부동 소수점 유형을 사용하십시오. FloatDouble은 Java 코어 라이브러리에서 유일하지 않은 Number이 아닙니다. 지금하시는 일은 BigDecimal입니다. 관련/DUP 수

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"