데이터 타입
Java에서는 소수를 다루기 위해 대표적으로 두 가지 데이터 타입을 사용한다.
- float: 32비트 부동 소수점 숫자. 상대적으로 적은 소수 자릿수 가짐. 부동 소수점 연산에 사용됨
- double: 64비트 부동 소수점 숫자. float보다 많은 소수 자릿수 가짐. 대부분의 소수 연산에 기본적으로 사용됨.
선언과 초기화
float f = 3.14f; // 'f' 접미사를 사용하여 float 타입임을 명시.
double d = 3.14; // 기본적으로 소수점 숫자는 double 타입으로 간주함.
소수 연산
일반적인 정수 연산과 동일
public class Main {
public static void main(String[] args) {
double a = 5.5;
double b = 2.0;
double sum = a + b; // 덧셈
double difference = a - b; // 뺄셈
double product = a * b; // 곱셈
double quotient = a / b; // 나눗셈
System.out.println("Sum: " + sum);
System.out.println("Difference: " + difference);
System.out.println("Product: " + product);
System.out.println("Quotient: " + quotient);
}
}
정밀도 문제
부동 소수점 연산에서는 정밀도 문제가 발생할 수 있다.
예를 들어, 0.1과 0.2를 더하면 0.3이 아닌 0.30000000000000004가 될 수 있다. 이는 부동 소수점 표현의 한계 때문이다:
public class Main {
public static void main(String[] args) {
double x = 0.1;
double y = 0.2;
double z = x + y;
System.out.println("Result: " + z); // 0.30000000000000004
}
}
부동 소수점의 내부 작동 방식
부동 소수점(Floating Point)은 실수를 표현하고 연산하는 방식이다. 컴퓨터는 부동 소수점을 사용하여 매우 크거나 작은 숫자를 효율적으로 표현할 수 있다. Java에서는 IEEE 754 표준을 따르는 부동 소수점 숫자를 사용한다.
부동 소수점의 구성
부동 소수점 숫자는 세 부분으로 구성된다:
- 부호(Sign): 숫자가 양수인지 음수인지를 나타낸다.
- 지수(Exponent): 숫자의 스케일을 결정한다. 숫자가 얼마나 큰지 또는 작은지를 나타낸다.
- 가수(Mantissa) 또는 유효숫자(Significand): 실제 숫자를 나타내는 부분이다.
부동 소수점 숫자는 다음과 같은 형태로 표현된다:
숫자 = (−1)sign × mantissa × 2exponent
IEEE 754 표준
IEEE 754 표준은 부동 소수점 숫자의 표현과 연산 방식을 정의한다. 이 표준에 따르면, 부동 소수점 숫자는 두 가지 주요 형식으로 표현된다:
- 단정밀도(Single Precision): 32비트로 구성. 부호 1비트, 지수 8비트, 가수 23비트.
- 배정밀도(Double Precision): 64비트로 구성. 부호 1비트, 지수 11비트, 가수 52비트.
부동 소수점 연산의 한계
부동 소수점 연산은 몇 가지 한계가 있다:
- 정밀도 제한: 모든 소수를 정확하게 표현할 수 없다. 예를 들어, 0.1은 2진수로 정확히 표현할 수 없다.
- 연산 오차: 부동 소수점 연산에서 오차가 누적될 수 있다.
- 비교의 어려움: 두 부동 소수점 숫자를 비교할 때, 매우 작은 오차 때문에 예상치 못한 결과가 나올 수 있다.
부동 소수점 연산의 한계를 보여주는 간단한 예제
public class FloatingPointExample {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println("0.1 + 0.2 = " + c); // 기대값: 0.3, 실제값: 0.30000000000000004
}
}
0.1과 0.2가 2진수로 정확히 표현되지 않기 때문에 발생하는 오차.
정확한 소수 계산을 위해서는?
Java에서는 BigDecimal 클래스를 사용한다. BigDecimal은 임의 정밀도의 숫자를 표현할 수 있어, 정확한 소수 계산이 가능하다:
import java.math.BigDecimal;
public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b);
System.out.println("0.1 + 0.2 = " + c); // 출력값: 0.3
}
}
'개발 > Java' 카테고리의 다른 글
[Java] java.util.Date - 'getYear()' is deprecated (0) | 2023.07.12 |
---|