본문 바로가기

자바 기초

실수형(Floating point type) 변수의 특징

실수형 변수에는 float과 double이 있습니다.

 

실수형 변수는 부동소수형(Floating point type)이라고 합니다.

 

 

한정된 메모리 공간에 무한의 실수를 표현하기 위해 정밀도를 포기하고 부동소수형으로 표현의 범의를 넓힌것입니다.

 

 

1. float : 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit = 4byte

부호(1bit) 지수(8bit) 가수(23bit)

 

2. double : 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit = 8byte

부호(1bit) 지수(11bit) 가수(52bit)

 

 

3. 실수형 변수의 기본타입은 double입니다.

   그래서 float을 저장할 때는 아래 코드와 같이 소문자 "f" 또는 대문자 "F"를 붙여야합니다.

   double을 저장할때는 소문자 "d" 또는 대문자 "D"를 붙일 수 있으나 생략 가능합니다.

double doubleNumber = 3.14195;
float floatNumber1 = 3.14195f;
float floatNumber2 = 3.14195 // 컴파일 에러

 

 

4. 실수형 변수의 e표기법

int inputNumber = 1000000;

double inputNumber1 = 1e6     // 1000000
float  inputNumber2 = 1e6f    // 1000000

double inputNumber3 = 2e-3    // 0.002

 

5. 실수형 변수의 정밀도 테스트

double doubleInput = 0.123456789123456789;
float  floatInput  = 0.123456789123456789f;

System.out.println(doubleInput);  // 0.12345678912345678
System.out.println(floatInput);   // 0.12345679

 float형 타입이 소수 6자리까지는 정확하게 표현할 수 있으나, 그 이상은 정확하게 표현하지 못함을 보여줍니다.

자바의 double형 타입은 소수 부분 15자리까지 오차없이 표현할 수 있습니다.

 

6. 부동소수점 방식의 오차

double testNum2 = 0;

testNum2 = testNum2 + 0.1;
System.out.println("Add 1 : " + testNum2);
// Add 1 : 0.1

testNum2 = testNum2 + 0.1;
System.out.println("Add 2 : " + testNum2);
// Add 2 : 0.2
        
testNum2 = testNum2 + 0.1;
System.out.println("Add 3 : " + testNum2);
// Add 3 : 0.30000000000000004

testNum2 = testNum2 + 0.1;
System.out.println("Add 4 : " + testNum2);
// Add 4 : 0.4

testNum2 = testNum2 + 0.1;
System.out.println("Add 5 : " + testNum2);
// Add 5 : 0.5

testNum2 = testNum2 + 0.1;
System.out.println("Add 6 : " + testNum2);
// Add 6 : 0.6

testNum2 = testNum2 + 0.1;
System.out.println("Add 7 : " + testNum2);
// Add 7 : 0.7

testNum2 = testNum2 + 0.1;
System.out.println("Add 8 : " + testNum2);
// Add 8 : 0.7999999999999999

testNum2 = testNum2 + 0.1;
System.out.println("Add 9 : " + testNum2);
// Add 9 : 0.8999999999999999

testNum2 = testNum2 + 0.1;
System.out.println("Add 10 : " + testNum2);
// Add 10 : 0.9999999999999999




double testNum3 = 0;

for (int i= 0; i<10; i++){
    testNum3 += 0.1;
    System.out.println("Add " + i + " : " + testNum3);
}

// Add 0 : 0.1
// Add 1 : 0.2
// Add 2 : 0.30000000000000004
// Add 3 : 0.4
// Add 4 : 0.5
// Add 5 : 0.6
// Add 6 : 0.7
// Add 7 : 0.7999999999999999
// Add 8 : 0.8999999999999999
// Add 9 : 0.9999999999999999

위의 예제에서 0.1을 10번 더한 합계는 1이 되어야 하지만, 실제로는 0.9999999999999999가 출력됩니다.

이처럼 컴퓨터에서 실수형의 모든 연산에는 언제나 작은 오차가 존재하게 됩니다.

이것은 자바뿐만 아니라 부동소수점 방식을 사용하는 프로그래밍 언어에서 발생하는 기본적인 문제입니다.

 

 

https://youtu.be/wuDUjM4yYms

 

 

https://youtu.be/E2DmkS31a8U

 

'자바 기초' 카테고리의 다른 글

조건문(if, switch)  (2) 2020.03.26
메소드(Method)  (0) 2020.03.17
정수형(Integer Type) 변수의 특징  (0) 2020.02.17
데이터형(Data Type)과 입력값(Literal)  (1) 2020.02.11
변수(Variable)란?  (1) 2020.02.10