NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Java 5. Float, double, decimal 형식.

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 자바의 실수형에 대해서 알아보겠습니다. Java도 C#의 실수형과 같습니다. Float 형식은 32비트, Double 형식은 64비트 부동 소수점 값을 저장하는 단순 형식을 나타냅니다. 다만, 다른점이라면 Java에서는 BigDecimal이라는 공용 클래스로 생성자를 통해 값을 할당할 수 있습니다. 그리고 공용 클래스라서 C#의 Built-in type에 비해 많은 기능이 구현되어 있습니다.

    Z75sjOw.jpg

     

     

    대부분의 프로그래밍 언어에서 할당 연산자의 오른쪽에 있는 실수형 숫자 리터럴은 double로 처리됩니다. 그렇기 때문에 float의 경우에는 접미사를 반드시 붙여줘야 합니다. 아래는 각 형식에 대해 접미사를 사용하는 방법과 Decimal형식을 어떻게 초기화 하는지 보여줍니다.

    package JavaType;
     
    import java.math.BigDecimal;
     
    public class Precision {
        public static void main(String[] args) {
            float floatType = 1.0f;
            double doubleType = 1.0d; // double은 접미사인 d 생략 가능
            
            // 아래 코드를 입력하고 ctrl + shift + O (OSX는 command + shift + O)를 누르면 자동으로 3라인과 같이
            // import를 자동으로 입력해줍니다.
            // C#은 ctrl + . 또는 shift + alt + F10을 통해서 using을 추가할 수 있습니다.
            BigDecimal decimalType = new BigDecimal("1.0");
            System.out.println(floatType);
            System.out.println(doubleType);
            System.out.println(decimalType);
        }
    }

     

     

    이 코드를 실행 해보면 아래와 같은 결과를 나타냅니다.

    Qas4Pum.png

     

     

    코드를 아래와 같이 수정한 후 다시 실행해 봅니다.

    package JavaType;
     
    import java.math.BigDecimal;
    import java.math.RoundingMode;
     
    public class Precision {
        public static void main(String[] args) {
            float floatType = 1.0f / 3;
            double doubleType = 1.0d / 3; // double은 접미사인 d 생략 가능
            
            BigDecimal decimalType = new BigDecimal("1.0").divide(new BigDecimal("3"), 100, RoundingMode.CEILING);
            
            System.out.println(floatType);
            System.out.println(doubleType);
            System.out.println(decimalType);
        }
    }

     

     

    아래는 실행한 결과입니다. float는 소수점 8자리에서 반올림되며, double은 소수점 16자리까지 표시됩니다. decimal의 경우에는 메모리가 허락하는 한 무제한입니다.

    esYk5RK.png

     

     

    C#과 비교하면 많은 차이를 보입니다. 자료형도 같고(Decimal은 예외) IEEE757의 스펙을 따르는 것도 같지만 언어의 차이에서 오는 미묘한 부분이 있습니다. Java는 플랫폼에 독립적이므로 어떤 운영체제에서도 위와 같은 결과를 보입니다. (가상 머신 구동되므로...) 물론, C#도 마찬가지죠. (플랫폼이 윈도우 하나지만...) 보통 제조 분야의 경우 Java와 C#을 둘다 해야 하는 경우가 많습니다. 서버는 Java로 되어 있고 클라이언트는 C#으로 되어 있기 때문인데요. 이럴 때 언어의 차이에서 오는 스펙을 잘 모르고 사용한다면 어느 부분에서 문제가 발생 되는지 찾기가 힘들어집니다. 이런 경우 DB의 값을 확인하고 서버 로그에 찍힌 값을 확인합니다. 그래도 문제를 발견하지 못했다면 클라이언트에서 반올림이 되었는지 연산에 오류가 있는지 파악해야 합니다.

    UFyfSJf.jpg

     

     

    그럼 실제로 연산의 결과를 보고 어느 정도의 정밀도(Precision)를 가지고 있는지 확인해 보도록 하겠습니다. main 메서드의 코드를 모두 지운 후 아래의 코드로 대체한 후 실행합니다.

    package JavaType;
     
    import java.math.BigDecimal;
    import java.math.RoundingMode;
     
    public class Precision {
        public static void main(String[] args) {
            float a = 69.6875f;
            System.out.printf("a : %s", a);
            System.out.println();
            
            double b = (double) a;
            System.out.printf("b : %s", b);
            System.out.println();
            System.out.printf("69.6875 == b : %s", 69.6875 == b);
            System.out.println();
            
            BigDecimal x = new BigDecimal("0.1");
            System.out.printf("x : %s", x);
            System.out.println();
            
            double y = x.doubleValue();
            System.out.printf("y : %s", y);
            System.out.println();
            System.out.printf("0.1 == y : %s", 0.1 == y);
            System.out.println();
        }
    }

     

     

    아래는 실행한 결과 화면입니다. C#과 비교해보면 Java가 얼마나 더 정확하게 표현하는지 확인할 수 있습니다. 아래의 코드를 C#에서 구현한 후 결과를 확인 해보면 예상하지 못한 결과를 받아볼수도 있습니다.

    ※ 이 부분에 있어서 Java도 정확한 값을 요하는 연산은 BigDecimal을 초기화할 때 문자열(String)로 초기화해야 합니다. 실수(Real number type)로 초기화 할 경우 C#과 동일한 결과를 나타냅니다.

    L9gR52g.png

     

     

    자세하게 다루지는 않겠지만 메모리가 허락하는 한 무한대의 정수를 표현하는 BigInteger도 있습니다. 이런 것들은 C#에는 없는 특별한 요소입니다. 하지만 간단하게 사용할 수 있도록 C#에서 제공하는 것과는 달리 Java에서는 공용 클래스로 제공하고 있습니다. 그리고 C#은 연산자 오버로딩이 되어 있으므로 일반적인 정수, 실수형과 동일하게 값을 처리할 수 있죠. Java는 BigDecimal에서 제공하는 add, subtract, multiply, divide메서드를 이용해야 합니다. 이외에도 많은 메서드로 연산을 지원하고 있습니다. 하지만, 이 부분에서 C#보다는 아무래도 가독성이 떨어지는 면이 없지않아 있습니다.

     

    클릭: [ C#의 float, double, decimal 실수형 비교. ]

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.