2014-03-31 11 views
0

내 코드는 다음과 같다 :이상한 행동

Input: 5.1 
Double: 5.1 
Integer: 509 
다음 inputValue가 5,10 출력되는 경우,

Input: 7.1 
Double: 7.1 
Integer: 710 

:하지만

Number inputAmount = NumberFormat.getNumberInstance(Locale.FRANCE).parse("7,10"); 
double doubleValue = inputAmount.doubleValue(); 
int intValue = (int) (doubleValue * 100); 

System.out.println("Input: " + inputAmount); 
System.out.println("Double: " + doubleValue); 
System.out.println("Integer: " + intValue); 

출력하는

이것은 5,10 및 4,10에서만 발생합니다. 이중 정밀도로 인해 발생한다는 것을 알고 있지만 정확히 어떻게 계산할 수는 없습니다. 아이디어가 있으십니까? 변경

+0

이 보이는 7이 될 수처럼 .. – Maroun

+0

이 BigDecimal를 사용해보십시오 4처럼 5 정확히 표현할 수없는 –

+0

예,이 문제가 발생하여 BigDecimal을 사용하고 해결했지만 처음 방법이 작동하지 않는 이유를 알고 싶었습니다. – user3139293

답변

0

여기서 문제는 곱셈 5.1d * 100d이 반올림 오류를 생성하여 그 결과가 509.99999999999994d이된다는 것입니다. 그리고이 double을 정수로 변환하면 결과는 분명히 509입니다. 여기에 무슨 일이 일어나고 있는지 이해하기

는 다음 사항을 고려하십시오

double doubleValue = 5.1d * 100d; // rounding error... 
System.out.println("Double: " + doubleValue); 
int intValue = (int) doubleValue; 
System.out.println("Integer: " + intValue); 

출력 :

Double: 509.99999999999994 
Integer: 509 
+0

5.10 및 4.10 값에서만 발생한다는 것은 이상합니다. – user3139293

0

시도 :

int intValue = (int) (doubleValue * 100); 

에 :

귀하의 코드가 상당히 이미 나는 그것을 곱하면 뭔가 이상한 내부 캐스팅으로 진행 될 수있다 생각하고 단순화
int intValue = (int) (doubleValue * 100d); 

. 100d는 int 로의 최종 변환 전에 두 배를 곱하는 것을 강제 할 것입니다.

+0

그건 작동하지 않았다. :/ – user3139293