실수 연산의 경우 float , double 타입의 사용에 주의해야 한다.
System.out.println(2.0 - 1.1); 를 해보면 그 이유를 알 수 있다.
이에 대한 결과는 0.9가 아니라 0.8999999999 결과가 출력 된다. 이는 컴퓨터가 숫자1.1을 double로
정확하게 표현 할 수 없어 근사치를 출력하기 때문이다. 이에 대한 해결책으로 정확한 소수 연산을 수행하는
BigDecimal타입이 있다. 단, 주의할 점은 항상 BigDecimal(double)이 아닌 BigDecimal(String) 생성자를 사용해
야 한다. 이유는 BigDecimal(double)을 사용하는 순간, double 자체가 정확하게 수를 표현 못하기 때문에 생성
자체부터 부정확한 값이 기억되기 때문이다.
예 1)
import java.math.*;
~
BigDecimal s1 = new BigDecimal("2.0");
BigDecimal s2 = new BigDecimal("1.1");
out.println(s1.subtract(s2));
BigDecimal타입의 사칙연산
매우 큰 숫자형의 연산은 BigDecimal 형으로 변경 후 계산을 하면 효과적이다.
예 2)
import! java.math.*;
public class Test {
public static void main(String[] args) {
BigDecimal su1 = new BigDecimal("12345678901234567899");
BigDecimal su2 = new BigDecimal("12345678901234567890");
BigDecimal p_add = su1.add(su2); // 더하기
BigDecimal p_sub = su1.subtract(su2); // 빼기
BigDecimal p_mul = su1.multiply(su2); // 곱하기
BigDecimal p_div1 = su1.divide(su2, BigDecimal.ROUND_UP); // 나누기 - 무조건 반올림
BigDecimal p_div2 = su1.divide(su2, 4, BigDecimal.ROUND_UP); // 나누기 - 소수점 4번째 자리에서 반올림.
System.out.println("덧셈 : " + p_add);
System.out.println("뺄셈 : " + p_sub);
System.out.println("곱셈 : " + p_mul);
System.out.println("나눗셈1 : " + p_div1);
System.out.println("나눗셈2 : " + p_div2);
}
}
'Dev. Java' 카테고리의 다른 글
[예외처리] throw / throws , try-catch-finally 예외처리 (0) | 2014.12.31 |
---|---|
추상 클래스 뽀개기 (0) | 2014.12.30 |
전화번호 정규식, 이메일 정규식, 빈값체크 정규식 (0) | 2014.08.01 |
자바 데이터 타입, 프로모션, 캐스팅 (0) | 2014.07.30 |
자바 컬렉션 프레임워크 - 개요 (0) | 2014.07.27 |