https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

 

Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See JDK Release Notes for information about new fe

docs.oracle.com

먼저 java primitive type에 대한 oracle document를 찾아보았다.

Literal에 대한 소개와 Interger, Floating-point, Character & Stirng으로 나누어 설명하고 있다. 그리고 JAVA7부터 추가된 숫자 사이 "_"(underscore)의 사용법에 대해서도 언급하고 있다. 단순 가독성을 위한 것으로 숫자와 숫자 사이에만 올 수 있다.

이 글에서 언급하고자 하는 내용인 돈 계산에 쓰이면 안 되는 type에 대한 내용은 처음 부분에 명확히 나와 있다.

  • byte : byte 데이터 타입은 8 비트 부호 있는 2의 보수 정수입니다. 최소값은 -128이고 최대 값은 127입니다 (포함). byte 타입은 메모리 절약이 실제로 중요한 큰 배열로 메모리를 저장하는 데 유용 할 수 있습니다. 또한 그들의 한계가 코드를 명확하게하는 데 도움이 되는 int 대신 사용될 수도 있습니다. 변수의 범위가 제한되어 있다는 사실은 문서 형식으로 제공할 수 있습니다.
  • short : short 데이터 타입은 16비트 부호 있는 2의 보수 정수입니다. 최소값은 -32,768이고 최대 값은 32,767입니다 (포함). byte와 마찬가지로 동일한 지침이 적용됩니다. 실제로 메모리 절약이 중요한 상황에서 short를 사용하여 큰 배열로 메모리를 저장할 수 있습니다.
  • int : 기본적으로 int 데이터 타입은 32 비트 부호 있는 2의 보수 정수이며, 최소값은 -231 이고 최대 값은 231-1입니다. Java SE 8 이상에서 int를 사용하여 최소값 0과 최대값 232-1의 부호 없는 32 비트 정수를 나타낼 수 있습니다. int 타입을 부호없는 정수로 사용하려면 Integer 클래스를 사용하십시오. 자세한 내용은 숫자 클래스 섹션을 참조하십시오. compareUnsigned, divideUnsigned 같은 정적 메소드등이 첨가된 Integer는 부호 없는 정수에 대한 산술 연산을 지원하는 클래스입니다.
  • long : long 데이터 타입은 64비트 2의 보수 정수입니다. signed long의 최소값은 -263 이고 최대 값은 263-1입니다. Java SE 8 이상에서 long 데이터 타입을 사용하여 최소값 0과 최대값 264-1의 부호 없는 64 비트 길이를 나타낼 수 있습니다. Long 클래스에는 unsigned long에 대한 산술 연산을 지원하기 위해 compareUnsigned, divideUnsigned 등과 같은 메소드가 포함되어 있습니다.
  • float : float 데이터 형식은 single-precision 32-bit IEEE 754 부동 소수점입니다. 값 범위는 이 설명의 범위를 벗어나지만 Java 언어 사양의 부동 소수점 타입, 형식 및 값 섹션에 지정되어 있습니다. byte와 short의 권장 사항과 마찬가지로 메모리를 큰 부동 소수점 배열로 저장해야하는 경우 double대신 float을 사용합니다. 이 데이터 타입은 통화와 같은 정확한 값에 사용해서는 안됩니다. 이를 위해서는 대신 java.math.BigDecimal 클래스를 사용해야 합니다. 숫자 및 문자열 커버 및 Java 플랫폼에서 제공하는 기타 유용한 클래스. floatdoubleBigDecimal

  • double : double 데이터 타입은 double-precision 64-bit IEEE 754 부동 소수점입니다. 값 범위는 이 설명의 범위를 벗어나지 만 Java 언어 사양의 부동 소수점 타입, 형식 및 값 섹션에 지정되어 있습니다. 10 진수 값의 경우가 데이터 타입이 일반적으로 기본 선택입니다. 위에서 언급했듯이 double 타입은 통화와 같은 정확한 값에 사용해서는 안됩니다.

  • boolean : boolean 데이터 타입에는 두 가지 가능한 값만 있습니다 : true 및 false. 참 / 거짓 조건을 추적하는 간단한 플래그 데이터 타입을 사용하십시오. 이 데이터 타입은 1 bit의 정보를 나타내지만 "크기"는 정확하게 정의된 것이 아닙니다.
  • char : char 데이터 타입은 단일 16-bit 유니 코드 문자입니다. 최소값 '\u0000'(또는 0)과 최대 값 '\uffff'(또는 65,535 포함)을 갖습니다.

float와 double에 대한 설명에는 "통화와 같은 정확한 값에 사용해서는 안됩니다."(This data type should never be used for precise values, such as currency.)라고 언급되어 있다. 또한 BigDecimal을 사용하라고 대안까지 친절하게 제시하고 있다.

Floating-point type의 문제

floating-point type의 연산 문제는 아래와 같이 99%의 정확도가 문제다. 큰 숫자를 다룰 수 있지만 연산을 하면 근사값이 계산되기 때문이다.

double d1 = 3;
double d2 = 0.01;
System.out.println(d1 + d2);    // 3.8099999999999996


double d3 = 2.4;
double d4 = 0.8;
System.out.println(d3 / d4);    // 2.9999999999999996

결론은 통화와 같은 정확한 계산을 위해선 BigDecimal을 사용해야 한다.

'Programming > Java' 카테고리의 다른 글

java print api 주의 사항  (0) 2021.01.15
Lombok @Builder에서 method name 이용 패턴  (0) 2020.05.21
JVM Garbage Collection Basic  (0) 2019.05.10
Non-blocking, Blocking  (0) 2019.03.18
Asynchronous (VS Synchronous)  (0) 2019.03.18

+ Recent posts