실수

실수

실수는 정수와 다른 형태의 저장 방식인 부동소수점 표기방식에 의해 저장되며, 실수의 저장 원리에서 살펴볼 수 있다. 중요한 특징들을 정리하면 다음과 같다.

  • 실수의 종류는 2가지이다(float : 4byte, double : 8byte)

  • 실수의 기본형태는 double이다.

  • 실수가 포함된 계산은 결과가 무조건 실수이다.

  • 실수는 표시하는 값이 정밀하지 않다.

  • 실수는 저장공간의 크기와 관계없이 정수보다 크다.

  • 실수는 순환형 구조를 가지지 않으며, 무한대라는 값을 허용한다.

실수 데모 1

import java.lang.*;

public class FloatExample1 {
    public static void main(String[] args){
        //float a = 3.14;//오류 발생
        float a = 3.14f;
        double b = 3.14;
        
        System.out.println(a);
        System.out.println(b);
    }
}

위의 예제를 통해 floatdouble의 초기화 방식의 차이에 대해 살펴볼 수 있다. double이 기본형태이기 때문에 3.14는 별다른 표시가 없다면 double로 인식된다. 따라서 float 형태로는 저장될 수 없어 오류가 발생하게 된다.

실수 데모 2

import java.lang.*;

public class FloatExample2 {
    public static void main(String[] args){
        float a = 3.141592653589793238462643383279f;
        double b = 3.141592653589793238462643383279f;
        
        System.out.println(a);
        System.out.println(b);
    }
}

위의 예제는 각각 소수점 30자리의 숫자를 floatdouble 형태의 변수에 저장한 뒤 출력했을 때 표시되는 소수점의 길이를 살펴보기 위한 예제이다. 즉, 각각의 실수 형태에 대한 정확도가 얼마나 되는지를 살펴보는 것이 목적이다.

출력 결과는 다음과 같다.

3.1415927
3.1415927410125732

doublefloat보다 정확도가 높은 것은 사실이나 둘 다 온전한 숫자를 다 포함할 수 없다는 특징을 가지고 있다. 따라서 정확한 계산을 수행해야 할 경우에는 자바에서 기본적으로 제공하는 실수를 이용하여 계산을 하기 어려우며, 별도의 도구를 이용해야 한다.

실수 데모 3

import java.lang.*;

public class FloatExample3 {
    public static void main(String[] args){
        int a = 10;
        float b = 3.0f;
        double c = 3.0;
        
        float d = a / b;
        double e = a / c;
        
        System.out.println(d);
        System.out.println(e);
    }
}

실행하면 다음과 같은 결과가 나온다.

3.3333333
3.3333333333333335

앞서 정수를 살펴볼 때 10 / 33임을 확인했으나 위의 코드는 실수가 포함되어있기 때문에 결과가 실수로 나오는 것을 확인할 수 있다. 좀 더 정확히 이야기하면, 계산식에 포함된 가장 큰 데이터 형태에 맞추어 출력된다는 것을 소수점 자리수를 통해 알 수 있다.

자료형의 크기에 대해서는 별도의 문서를 통해 정리하도록 한다.

실수 데모 4

import java.lang.*;

public class FloatExample4 {
    public static void main(String[] args){
        double a = 10.0;
        double b = 0.0;
        
        double c = a / b;
        double d = a % b;
        
        System.out.println(c);
        System.out.println(d);
    }
}

결과는 다음과 같이 출력된다.

Infinity
NaN

출력되는 값에 대한 설명은 다음과 같다.

  • Infinity : 양의 무한대를 의미한다. 음의 무한대는 -Infinity이며 둘은 같지 않다.

  • NaN : Not a Number의 줄임말이며, 숫자가 아니라는 의미이다.

정수에서는 오류가 발생하지만, 실수에서는 이와 같이 특수값들이 출력되므로 이용에 참고하도록 한다.

Last updated