티스토리 뷰

자바에서는 실수 연산의 오차를 줄이기 위해 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 자리수에 만 결과
입력되는 수치UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY
5.56565656ArithmeticException 의 throw
2.53232322ArithmeticException 의 throw
1.62121222ArithmeticException 의 throw
1.12121111ArithmeticException 의 throw
1.011111111
-1. 0-1-1-1-1-1-1-1-1
-1. 1-2-1-1-2-1-1-1ArithmeticException 의 throw
-1. 6-2-1-1-2-2-2-2ArithmeticException 의 throw
-2. 5-3-2-2-3-3-2-2ArithmeticException 의 throw
-5. 5-6-5-5-6-6-5-6ArithmeticException 의 thr


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31