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로의 변환은 피해야 한다.
'팁 > 자바' 카테고리의 다른 글
| 자바 멀티스레딩 - CAS 연산 (2) | 2025.07.24 |
|---|---|
| 공용 풀 사용은 CPU바운드 작업에만 적합하다. (0) | 2025.06.01 |
| Optional 중 즉시평가, 지연평가 (1) | 2025.05.28 |