본문 바로가기
팁/자바

long to Double 의 정밀도손실

by wcwdfu 2025. 6. 3.

1) long 에서 Double 로 변환시 정밀도손실이 발생할 수 있다.

먼저보는 결론 ::

long과 달리 double은 부동소수점 방식으로 수를 표현, long은 64비트지만 double은 정수부가 53비트까지만 정밀하다.


다음과 같은 코드를 통해 쉽게 확인할 수 있다.

long longValue=111_111_111_111_111_111L;
System.out.println("longValue = " + longValue);

double doubleValue = longValue;
System.out.println("doubleValue = " + new BigDecimal(doubleValue).toString());

long longValue2 = (long)doubleValue;
System.out.println("longValue2 = " + longValue2);

1이 18번 들어가는 큰 수를 할당한다.

처음엔 이를 그대로 출력한다.

 

두번째는 double로 바꾼 뒤 출력한다.

※ BigDecimal은 정밀한 소수 및 매우 큰 정수 계산을 위해 사용하는 클래스

 

세번째는 두번째 값을 다시 long으로 캐스팅해서 출력한다.

 

다음과 같이 출력된다.

longValue = 111111111111111111
doubleValue = 111111111111111104
longValue2 = 111111111111111104

 

즉 ,111_111_111_111_111_111L 같은 큰 long 값은 double로 변환할 경우 정밀도 손실이 발생한다.

따라서 이처럼 정확한 정수값이 필요한 경우 double로의 변환은 피해야 한다.