자바에서 primitive type의 실수 자료형이라면 float와 double이 있습니다. float는 4Byte double은 8Byte로 표현된다고 하는데요, 0과 1이 32개, 64개로 어떻게 실수를 표현이 가능한지 한번 정리해보려 합니다.
컴퓨터가 실수를 어떻게 저장하는지 이해하려면 2진수를 가지고 어떻게 실수를 표현하는지에 대해 먼저 이해해야합니다.
우선 3을 2진수로 표현하게 된다면
이므로
로 표현이 가능합니다.
이렇게 2진수를 정수로 표현할 때는 1, 2, 4, 8 등의 합으로 표현했던 것처럼 실수부분을 표현할 때는 0.5, 0.25, 0.125 와 같은 , , 의 합으로 표현합니다.
이와같이 3.75의 경우는 이진수로 표현하면 11.11 과같이 표현이 가능합니다.
그러나 십진수에서 같은 무한소수가 나타나는 것처럼 이진수에서도 무한소수가 나타납니다. 동일한 의 경우 과 같이 끊임없이 이어지기 때문에 이진수로 0.010101... 과 같이 나타납니다.
또한 십진수에서 1234.5678을 1.2345678 x 으로 나타내는 것 처럼 이진수도 111.001을 1.11001 x 으로 나타낼 수 있습니다.
이러한 특성들을 가지고 32, 64개의 0과1을 가지고 실수를 표현할 수 있습니다.
실수는 sign, exponent, fraction 필드로 나누어집니다.
양수인지 음수인지를 저장하는 필드
x 같은 과학적 표기법에서 3과같은 지수를 저장하는 필드
유효숫자 부분을 저장하는 필드
float는 1, 8 , 23 비트로 구성되고,
double은 1, 11 52 비트로 구성됩니다.
System.out.print(0.1+0.1+0.1 == 3);
// 출력 결과 : false
위와같은 경우 당연히 true가 나올것으로 예상하지만 실제로는 false가 나오는걸 확인 할 수 있습니다.
false가 나오는 이유를 알아보자면 0.1은 0.0001100110011... 과 같은 무한소수로 표현되기 때문에 fraction 필드의 범위 가 넘어가는 부분(float는 23칸까지, double은 52칸 까지)은 잘라내야 하기에 오차가 발생합니다. 이러한 오차를 가진 상태로 3번 더해져 0.3과는 다른 값을 저장하고 있음을 유추할 수 있습니다.
float는 유효숫자가 6자리이고 double은 유효숫자가 15자리 입니다. 코딩테스트에서는 double을 사용하면 됩니다.
System.out.print(0.1+0.1+0.1 == 3);
// 출력 결과 : false
이전에 설명했듯이 실수는 아주 작은 오차가 존재할 수 있기에 실수를 비교할 때는 등호를 사용해서는 안됩니다!