2014-12-28 1 views
4

오늘 저는 Math.pow()의 독특한 행동을 보았습니다.Java의 Math.pow가 결과를 반올림합니까?

long N1 = 999999999999999999L; 
System.out.println("N1 : " + N1); 

long N2 = (long) Math.pow(N1, 1); 
System.out.println("N2 : " + N2); 

나는 다음과 같은 출력을 얻을 :

N1 : 999999999999999999 
N2 : 1000000000000000000 

난 항상 Math.pow는()만큼 정확한 결과를 생성 생각을 나는 다음과 같은 자바 코드의 출력을 이해할 수 없습니다입니다 전달 된 매개 변수는 오버플로가없는 경우 정수 또는 long입니다 (이 경우 true).

+9

... 무엇을 Math.pow()를 사용하지 않고 변환을 수행하면 어떻게됩니까? 같은 일을하지 않습니까? –

+0

@MichaelAaronSafyan 맞습니다! 'long N3 = (long) (double) N1;' –

+4

'long'과'double'은 모두 64 비트를 차지하며 'long'으로 정확하게 표현할 수없는'double' 값이 많이 있습니다. 따라서 'double'값으로 정확히 표현할 수없는 'long'값이 많이 있어야합니다. 당신은 그들 중 하나를 발견했습니다. –

답변

10

longdouble

System.out.println((double)999999999999999999L); 

출력 캐스팅 이유는

1.0E18 

System.out.println((long)(double)999999999999999999L); 

출력 :

1000000000000000000 
01 23,516,
+1

+1, 복식은 정확히 인쇄되지 않기 때문에, System.out.println ((long) (double) 999999999999999999L); – ruakh

+0

을 작성하는 것이 더 좋을 것입니다. 덕분에 내가 배후에서 무슨 일이 일어나고 있는지 이해할 수있었습니다 . – scv

0

당신은 계산 BigDecimal를 사용하고 유형 사이의 변환에 정밀도를 잃을 수 없습니다 :

BigDecimal b = new BigDecimal(999999999999999999L); 
BigDecimal pow = b.pow(1); 
이 코드는 다시 더블로 긴으로 변환됩니다
관련 문제