2017-05-07 1 views
1

doublelong 유형의 두 변수 y 및 z가 있습니다. 내 문제는 동등 연산자가 아래 코드 스 니펫에서 볼 수 있듯이 값이 같지 않더라도 true를 반환한다는 것입니다. Z는 Y 이상의 작은 값이있는 경우같음 값에 대해 같음 연산자가 true를 반환합니다.

public class Test { 
    public static void main(String[] args) throws Exception { 
     double y = (double) Long.MAX_VALUE; 
     System.out.println(y);//9.223372036854776E18 
     long z = Long.MAX_VALUE - 1; 
     System.out.println(z);//9223372036854775806 
     System.out.println(y == z);//=============true 
    } 
} 

내 쿼리입니다 왜 y를 == z의 사실오고있다.

이 동작을 설명 할 수 있습니까?

+0

산출이 값을 인쇄 시도 :

당신은 Math.nextDown을 사용하여 다른 부동 소수점 값을 얻기 위해 (Long.MAX_VALUE - delta에서와 같이) 필요한 델타를 볼 수 있습니까? – GhostCat

+0

예, 둘 다 다릅니다. –

+0

'2^53-1'보다 긴 값은 정확히 double로 표시 될 수 없습니다. –

답변

4

두 가지 일이 여기에 있습니다. double == long에서

  1. 상기 longdouble-promoted이다. y == z이라는 표현식은 (double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1)과 같습니다.

  2. double의 비트 수는 53 비트입니다. long> 2 을 double로 변환 할 때, 최하위 비트는 반올림되어 (double) Long.MAX_VALUE (= 2 -1)과 (double) (Long.MAX_VALUE - 1)이 같은 값이됩니다. y == z을 평가하기

4

는, 자바는 이중에 z을 촉진한다.

2^53 - 1보다 큰 임의의 long 값은 정확히 이중으로 표시 될 수 없습니다.

(double) Long.MAX_VALUE 동일 (double) (Long.MAX_VALUE - 1)입니다. 왜냐하면 double은 두 값을 뚜렷하게 표현하기에 충분한 정밀도가 없기 때문입니다.

double delta = y - Math.nextDown(y); 

이 1024

+0

나의 투표 첫 번째 답변은 여기에 있습니다 :-) – GhostCat