Java BigDecimal 클래스 사용 및 고려 사항
3574 단어 JavaBigDecimal
JDK 문서의 설명은 다음과 같습니다.
가변적이고 임의의 정밀도를 가진 기호 십진수.BigDecimal은 임의의 정밀도의 정수 비표도값과 32비트의 정수 표도(scale)로 구성되어 있다.0이나 양이면 소수점 뒤의 자릿수를 나타냅니다.만약 음수라면, 이 수의 비표도값을 10의 음scale 차멱에 곱한다.따라서 BigDecimal이 나타내는 수치는 (unscaledValue× 10-scale).
구체적 해석
1.BigDecimal 객체의 값은 변경할 수 없습니다.이 기능은 BigDecimal 객체의 연산 함수에 나타납니다.
BigDecimal a = new BigDecimal("1.22");
System.out.println("construct with a String value: " + a);
BigDecimal b = new BigDecimal("2.22");
a.add(b);
System.out.println("a plus b is : " + a);
우리는 쉽게 출력할 것이라고 생각할 수 있다.construct with a Stringvalue: 1.22
a plus b is :3.44
하지만 실제로는 a플러스 b is: 1.22
2."BigDecimal은 임의의 정밀도의 정수 비표도 값과 32비트의 정수 표도(scale)로 구성되어 있습니다. 표도 값이 0 또는 양이면 표도는 소수점 뒤의 자릿수입니다."이 말은 이렇게 볼 수 있다.
예: -12 및 13.412
- 12× 10-0 및 13412× 10-3
여기에서 (비표도값과 표도) 는 [-12,0] 과 [13412,3] 으로 표시됩니다.
3."눈금값이 음수이면 이 수의 비눈금값을 10의 음scale 차멱에 곱합니다."이 말은 이렇게 볼 수 있다.
예: 120.00
이 값은 12000입니다.× 10-2
여기에는 (비표도값과 표도) 로 표시됩니다.[12000,2]
여기에 표시된 값은 여전히 정수 2이지만 다음 작업을 수행합니다.
BigDecimal amount = new BigDecimal("-120.00");
//반환 수치는 이 소수와 같지만 이 표현에서 모든 꼬리 0의 BigDecimal을 제거합니다.
amount = amount.stripTrailingZeros();
이 값은 12입니다.× 10-(-1)
여기에는 (비표도값과 표도) 로 표시됩니다.[12,-1]
사용 고려 사항
1.구조 함수
BigDecimal aDouble =new BigDecimal(1.22);
System.out.println("construct with a double value: " + aDouble);
BigDecimal aString = new BigDecimal("1.22");
System.out.println("construct with a String value: " + aString);
출력 결과는 다음과 같습니다.construct with a doublevalue:1.2199999999999999733546474089962430298328399658203125
construct with a String value: 1.22
JDK 설명:
a) 매개 변수 유형이 더블인 구조 방법의 결과는 어느 정도 예측할 수 없는 것이다.어떤 사람들은 자바에 newBigDecimal(0.1)을 써서 만든 BigDecimal이 0.1(비표도값 1, 표도값 1)과 같다고 생각할 수 있지만, 실제로는 0.1000000000000055551123125727021815834541015625와 같다.이것은 0.1이 더블로 정확하게 표시할 수 없기 때문이다. (또는 이 상황에 대해 어떠한 유한한 길이의 2진 소수도 표시할 수 없기 때문이다.이렇게 하면 구조 방법에 전달된 값은 0.1과 같지 않을 것이다.
b) 다른 한편, String 구조 방법은 완전히 예측할 수 있습니다. new BigDecimal("0.1")을 쓰면 BigDecimal이 생성됩니다. 이것은 예상한 0.1과 같습니다.따라서 일반적으로 String 구조 방법을 우선적으로 사용하는 것이 좋습니다.
c) 더블이 BigDecimal의 원천으로 사용되어야 할 때 이 구조 방법은 정확한 전환을 제공했다는 것을 주의하십시오.이것은 Double를 먼저 사용하는 것과 같은 결과를 제공하지 않습니다.toString(double) 방법을 사용하고 BigDecimal(String) 구조 방법을 사용합니다.더블을 String으로 변환하거나 String의 static 방법: String을 사용할 수 있습니다.valueOf(double).
2.연산 조작.가감승제는 사실 최종적으로 모두 새로운 BigDecimal 대상으로 되돌아온다. 왜냐하면 BigDecimal은 모두 변할 수 없는(immutable)이기 때문에 매 단계의 연산을 진행할 때 새로운 대상이 생기기 때문에 a.add(b).덧셈 조작을 했지만 a는 덧셈 조작 후의 값을 저장하지 않았습니다. 정확한 용법은 a=a.add(b)입니다.
예:
BigDecimal 객체가 정수인지 여부를 결정합니다.
private boolean isIntegerValue(BigDecimal bd) {
return bd.signum() == 0 || bd.scale() <= 0 || bd.stripTrailingZeros().scale() <= 0;
}
왜 이렇게 하는지 아래의 예를 테스트해 보세요.BigDecimal amount = new BigDecimal("-120.00");// "0", "0.00", "1.00","10.00" "10.10"
System.out.println(amount.signum());//
System.out.println(amount.scale()); //
System.out.println(amount.stripTrailingZeros().scale());//
참고:클래스 BigDecimal
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.