[데이터형] double 데이터타입 연산 문제
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args) {
//수학적으로 처리되는 연산 결과
System.out.println("올바른 연산값: 2.00 - 1.10 = 0.9");
//double 데이타형은 가장 가까운 값으로 잘못 연산되어 진다.
System.out.println("double타입 비정상 연산: 2.00 - 1.10 = " +(2.00 - 1.10));
//정확한 연산을 위해 BigDecimal 이용 해야 한다. 주의 사항은 문자열(string 형)으로 BigDecimal을 생성해야 한다.
System.out.println("BigDecimal.valueOf()로 데이터 타입 변환 후 정상 연산: "
+(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.10))));
System.out.println("BigDecimal(\"문자열\")로 데이터 타입 변환 후 정상 연산: "
+(new BigDecimal("2.00").subtract(new BigDecimal("1.10"))));
//BigDecimal을 이용했지만 double로 값지정으로 잘못된 연산이 이루어 진다.
System.out.println("BigDecimal타입 비정상 연산: "
+(new BigDecimal(2.00).subtract(new BigDecimal(1.10))));
//BigDecimal생성시 문자열의 최대 소숫점자리수가 지정된 기준으로 결과값의 소숫점자리가 지정된다.
System.out.println("BigDecimal 타입연산결과 문자열기준으로 소숫점 표시1: "
+(new BigDecimal("2.000").subtract(new BigDecimal("1.10"))));
System.out.println("BigDecimal 타입연산결과 문자열기준으로 소숫점 표시2: "
+(new BigDecimal("2.00").subtract(new BigDecimal("1.100"))));
}
}
===> 실행결과
올바른 연산값: 2.00 - 1.10 = 0.9
double타입 비정상 연산: 2.00 - 1.10 = 0.8999999999999999
BigDecimal.valueOf()로 데이터 타입 변환 후 정상 연산: 0.9
BigDecimal("문자열")로 데이터 타입 변환 후 정상 연산: 0.90
BigDecimal타입 비정상 연산: 0.899999999999999911182158029987476766109466552734375
BigDecimal 타입연산결과 문자열기준으로 소숫점 표시1: 0.900
BigDecimal 타입연산결과 문자열기준으로 소숫점 표시2: 0.900