자바를 처음 접할 때 변수를 공부하면서 실수형 변수로 float과 double에 대해 들어보셨을 겁니다.
실수(實數, 영어: real number)는 주로 실직선 위의 점 또는 십진법 전개로 표현되는 수 체계를 뜻한다
https://ko.wikipedia.org/wiki/%EC%8B%A4%EC%88%98
실수는 정수, 0을 포함하며 소수점으로 표현된 유리수, 무리수 등을 모두 일컫습니다. 이러한 실수를 자바에서는 float, double을 이용하여 근사적으로 표현하고 있습니다.
이들은 유한한 메모리를 사용하여 숫자를 저장하므로, 유리수와 무리수를 포함한 모든 실수를 완벽하게 정확하게 표현할 수 없습니다.
그렇다면 자바에서 float과 double은 어떤 방식으로 실수를 근사적으로 저장하고 표현할 수 있을까요?
먼저 진법에 대한 개념이 필요합니다. 사람은 손가락 갯수를 활용하여 숫자를 셌기 때문에 일상생활에서 주로 10진법을 사용합니다(그렇게 유추합니다..)
하지만 컴퓨터는 2진 체계로 설계되었기 때문에 0과 1로 이루어진 2진수로 바꾸어 저장을 해야합니다.
예를 들어 int age = 25 // 변수 age에 25를 저장 한다면 실제로 컴퓨터에서는 int 타입의 크기(4 byte) 즉, 32자리의 2진수로 표현하여 '00000000000000000000000000011001'이 됩니다.
그렇다면 소수점은 어떻게 2진법으로 표현할 수 있을까??
1. 10진 소수점수를 2진 소수점수로 변환하는 방법
10진 소수점수를 2진 소수점수로 변환하는 방법은 10진 소수점수에 2를 계속 곱하여 변환합니다.
예를 들어 10진수 0.625를 2진수로 변환하는 방법은 다음과 같습니다.
1. 10진 소수에 2를 곱한다.
0.625 x 2 = 1.25
2. 위의 결과에서 소수부만 가져다가 다시 2를 곱한다.
0.25 x 2 = 0.5
3. 1번과 2번 과정을 소수부가 0이 될 때까지 반복한다.
0.625 x 2 = 1.25
0.25 x 2 = 0.5
0.5 x 2 = 1.0
위의 결과에서 정수부만을 위에서 아래로 순서대로 적고 '0.'을 앞에 붙이면 된다.
2. 2진 소수점수를 10진 소수점수로 변환하는 방법
2진 소수를 10진 소수로 바꾸는 방법은 아래와 같습니다.

float, double 타입과 int 타입의 저장 방식을 비교해봅시다.
int 타입은 '부호와 값' 두 부분으로 이루어져있지만, float 과 double 과 같은 실수형은 '부호(S), 지수(E), 가수(M)' 세부분으로 이루어져 있습니다.
즉, 2의 제곱을 곱한 형태 ()로 저장하기 때문에 큰 범위의 값을 저장하는 것이 가능합니다.
그러나 정수형과 달리 실수형은 오차가 발생할 수 있다는 단점이 있습니다. 그래서 실수형에서는 표현할 수 있는 값의 범위뿐만 아니라 정밀도(precision)도 중요한 요소입니다.

float 타입은 정밀도가 7자리인데 이것은 의 형태로 표현된 '7자리의 10진수를 오차없이 저장할 수 있다`는 뜻입니다.
만일 7자리 이상의 정밀도가 필요하다면 변수 타입을 double로 해야합니다 (정밀도가 약 2배인, 10진수로 15자리의 정밀도를 가진다)
실수형 값을 저장할 때, float 타입이 아닌 double 타입의 변수를 사용하는 경우 대부분 저장하려는 '값의 범위' 때문이 아니라 '높은 정밀도'가 필요해서입니다.

위에서 설명을 드렸지만 실수 중에는 무한소수가 존재하기 때문에 정수와 달리 실수를 저장할 때 오차가 발생할 수 잇습니다.
게다가 10진수가 아닌 2진수로 저장하기 때문에 10진수로는 유한소수이더라도, 2진수로 변환하면 무한소수가 되는 경우가 있습니다.
9.1234567 10진수
⬇️ 변환
1001.000111111001101011011011... 2진수(무한소수)
정규화
1001.000111111001101011011011... ------> 1.00100011111100110101101 X 2^3
정규화된 2진 실수는 항상 '1.'으로 시작하기 때문에, '1.'을 제외한 23자리의 2진수가 가수mantissa)로 저장되고 그 이후는 잘려 나갑니다.
지수는 기저법으로 저장되기 때문에, 지수인 3에 기저인 127을 더한 130이 2진수로 변환되어 저장됩니다(10000010)
앞서 23자리 2진수를 제외한 나머지 잘려나간 값들에 의해 발생할 수 있는 가수의 마지막 비트의 단위()입니다.
은 10진수로 0.0000001192(약 )이므로 float의 정밀도가 7자리라고 하는 것입니다.
📝 원본자료
Java의 정석(3판) [남궁성/도우출판/2016]