티스토리 뷰
자바에서는 실수 연산의 오차를 줄이기 위해 BigDecimal 클래스를 사용해야 한다.
특히, 금액 계산에서 중요한 문제.
샘플코드>
package sample.common;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class BigDecimalSample {
public static void main(String[] args) {
// 잘못된 실수 연산
double da = 0.1;
double db = 0.01;
double dc = da - db;
System.out.println("da - db = " + dc); // 0.09000000000000001
// 올바른 실수 연산 예
BigDecimal ba = BigDecimal.valueOf(0.1);
BigDecimal bb = BigDecimal.valueOf(0.01);
BigDecimal bc = ba.subtract(bb);
System.out.println("ba - bb = " + bc.doubleValue()); // 0.09
// 잘못된 BigDecimal 생성. double실수값을 생성자로 생성해도 연산결과가 정확하지 않을 수 있음. 위에 처럼 valueOf로 생성.
BigDecimal ca = new BigDecimal(0.1);
BigDecimal cb = new BigDecimal(0.01);
BigDecimal cc = ca.subtract(cb);
System.out.println("ca - cb = " + cc.doubleValue()); //0.09000000000000001
// 나누기 연산 시에는 반드시 MathContext를 이용하여 연산 정확도와 라운드 방식을 지정해야 함.
BigDecimal xa = BigDecimal.valueOf(1.0);
BigDecimal xb = BigDecimal.valueOf(0.03);
BigDecimal xc = xa.divide(xb, MathContext.DECIMAL64);
BigDecimal xd = xa.divide(xb, MathContext.DECIMAL128);
System.out.println("DECIMAL64 xa / xb = " + xc.doubleValue()); //33.33333333333333
System.out.println("DECIMAL128 xa / xb = " + xd.doubleValue()); //33.333333333333336
// 소수점 올림, 내림
System.out.println(xc.setScale(0, RoundingMode.DOWN)); //33
/*
RoundingMode.UP : 올림, 0에서 멀어지는 방향. 12.3 -> 13, -12.3 -> -13
RoundingMode.DOWN : 내림, 0에 가까워지는 방향. 12.3 -> 12, -12.3 -> -12
RoundingMode.CEILING : 큰 값 쪽으로 이동. 양수일 때 올림, 음수일 때 내림. 12.3 -> 13, -12.3 -> -12
RoundingMode.FLOOR : 작은 값 쪽으로 이동. 양수일 때 내림, 음수일 때 올림. 12.3 -> 12, -12.3 -> -13
RoundingMode.HALF_UP : 반올림 0.5 이상(>=) 시 올림.
RoundingMode.HALF_DOWN : 반올림 0.5 초과(>) 시 올림
RoundingMode.HALF_EVEN : 가까운 쪽으로 올림.
*/
}
}
라운드모드 예)
특정의 둥근 모드로 입력을 1 자리수에 만 결과 | ||||||||
---|---|---|---|---|---|---|---|---|
입력되는 수치 | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN | UNNECESSARY |
5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 | ArithmeticException 의 throw |
2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 | ArithmeticException 의 throw |
1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 | ArithmeticException 의 throw |
1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 | ArithmeticException 의 throw |
1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-1. 0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
-1. 1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 | ArithmeticException 의 throw |
-1. 6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 | ArithmeticException 의 throw |
-2. 5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 | ArithmeticException 의 throw |
-5. 5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 | ArithmeticException 의 thr |
- Total
- Today
- Yesterday