Java BigDecimal 클래스 사용 및 고려 사항

3574 단어 JavaBigDecimal
BigDecimal 소개
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

좋은 웹페이지 즐겨찾기