일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- memcached
- custom valid
- dto valid
- spring boot
- spring
- NextJS
- 리눅스
- CentOS6
- java8
- JPA
- 초기 구축
- generate pojos
- generate entity
- React
- 초기 세팅
- Java
- ollama langflow
- 도커
- MySQL
- java9
- docker 설치
- jpa entity자동
- jvm
- header setting
- 헤더 설정
- JavaScript
- Next.js 14
- swagger
- SpringBoot
- docker
- Today
- Total
개발자의 길
[java]Java.math.BigDecimal의 사용(double,float 더하기 버그해결) 본문
Java.math.BigDecimal의 사용
실수 연산의 경우 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);
}
}
'4. JAVA' 카테고리의 다른 글
[java] 오라클에서 clob으로 받아온 데이터 String으로 처리 하기 (0) | 2014.06.17 |
---|---|
[java]스프링 쿼츠 (Spring Quartz) 스케쥴러에 배치(Batch) 파일 등록하기 [출처] 스프링 쿼츠 (Spring Quartz) 스케쥴러에 배치(Batch) 파일 등록하기|작성자 비전공 개발자 (0) | 2014.02.14 |
[java] inputstream, outputstream 예제 (0) | 2014.01.24 |
[java]imageIO를 이용한 url로 이미지 가져와 로컬에 저장하기 (0) | 2013.11.19 |
[java]랜덤a~z,0~9 조합 하여 랜덤으로 String만들기 (0) | 2013.07.03 |
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.