Java Language
BigDecimal
수색…
소개
BigDecimal 클래스는 산술 (덧셈, 뺄셈, 곱셈, 나눗셈), 스케일 조작, 반올림, 비교, 해시 및 형식 변환에 대한 연산을 제공합니다. BigDecimal는 불변의, 임의 정밀도의 부호 첨부 10 진수를 나타냅니다. 이 등급은 고정밀 계산의 필요성에서 사용되어야한다.
BigDecimal 객체는 불변입니다.
BigDecimal로 계산하고 싶다면 BigDecimal 객체가 불변이므로 반환 값을 사용해야합니다.
BigDecimal a = new BigDecimal("42.23");
BigDecimal b = new BigDecimal("10.001");
a.add(b); // a will still be 42.23
BigDecimal c = a.add(b); // c will be 52.231
BigDecimal 비교
compareTo
메소드는 BigDecimals
을 비교하는 데 사용해야합니다.
BigDecimal a = new BigDecimal(5);
a.compareTo(new BigDecimal(0)); // a is greater, returns 1
a.compareTo(new BigDecimal(5)); // a is equal, returns 0
a.compareTo(new BigDecimal(10)); // a is less, returns -1
일반적으로 당신은 사용하지 말아야 equals
이 두 가지 고려하기 때문에 방법 BigDecimals
그들이 가치가 동일하며 확장 할 경우에만 동일 :
BigDecimal a = new BigDecimal(5);
a.equals(new BigDecimal(5)); // value and scale are equal, returns true
a.equals(new BigDecimal(5.00)); // value is equal but scale is not, returns false
BigDecimal을 사용한 수학 연산
이 예제는 BigDecimal을 사용하여 기본적인 수학 연산을 수행하는 방법을 보여줍니다.
1. 추가
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
//Equivalent to result = a + b
BigDecimal result = a.add(b);
System.out.println(result);
결과 : 12
2. 추론
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
//Equivalent to result = a - b
BigDecimal result = a.subtract(b);
System.out.println(result);
결과 : -2
3. 다중화
2 개의 BigDecimal
곱셈하면 (자), 결과는 피연산자의 스케일의 합계와 같은 스케일을가집니다.
BigDecimal a = new BigDecimal("5.11");
BigDecimal b = new BigDecimal("7.221");
//Equivalent to result = a * b
BigDecimal result = a.multiply(b);
System.out.println(result);
결과 : 36.89931
결과의 스케일을 변경하려면 연산자의 규칙을 설명하는 객체, 특히 결과의 정밀도와 반올림 모드 인 MathContext
전달할 수있는 오버로드 된 multiply 메소드를 사용합니다. 사용 가능한 반올림 모드에 대한 자세한 내용은 Oracle 설명서를 참조하십시오.
BigDecimal a = new BigDecimal("5.11");
BigDecimal b = new BigDecimal("7.221");
MathContext returnRules = new MathContext(4, RoundingMode.HALF_DOWN);
//Equivalent to result = a * b
BigDecimal result = a.multiply(b, returnRules);
System.out.println(result);
결과 : 36.90
4. 분배
Division은 다른 산술 연산보다 약간 복잡합니다. 예를 들어 다음 예제를 고려하십시오.
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
BigDecimal result = a.divide(b);
System.out.println(result);
우리는 이것을 통해 0.7142857142857143과 비슷한 것을 기대할 수 있습니다.
결과 : java.lang.ArithmeticException : 종결되지 않는 10 진수 확장; 정확한 표현 가능한 소수 결과가 없습니다.
결과가 종료 십진수 일 때 완벽하게 잘 작동합니다. 5를 2로 나누고 싶다고 말하면됩니다. 그러나 나누기가 끝나지 않으면 결과가 ArithmeticException
됩니다. 실세계 시나리오에서는 나누기 중 발생할 수있는 값을 예측할 수 없으므로 BigDecimal 나누기에 Scale 및 Rounding Mode 를 지정해야합니다. 축척 및 라운딩 모드에 대한 자세한 내용은 Oracle 설명서를 참조하십시오.
예를 들어 다음과 같이 할 수 있습니다.
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
//Equivalent to result = a / b (Upto 10 Decimal places and Round HALF_UP)
BigDecimal result = a.divide(b,10,RoundingMode.HALF_UP);
System.out.println(result);
결과 : 0.7142857143
5.Remainder 또는 Modulus
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
//Equivalent to result = a % b
BigDecimal result = a.remainder(b);
System.out.println(result);
결과 : 5
6.Power
BigDecimal a = new BigDecimal("5");
//Equivalent to result = a^10
BigDecimal result = a.pow(10);
System.out.println(result);
결과 : 9765625
7. 맥스
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
//Equivalent to result = MAX(a,b)
BigDecimal result = a.max(b);
System.out.println(result);
결과 : 7
8. 분
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");
//Equivalent to result = MIN(a,b)
BigDecimal result = a.min(b);
System.out.println(result);
결과 : 5
왼쪽으로 이동합니다.
BigDecimal a = new BigDecimal("5234.49843776");
//Moves the decimal point to 2 places left of current position
BigDecimal result = a.movePointLeft(2);
System.out.println(result);
결과 : 52.3449843776
10. 오른쪽으로 포인트 이동하기
BigDecimal a = new BigDecimal("5234.49843776");
//Moves the decimal point to 3 places right of current position
BigDecimal result = a.movePointRight(3);
System.out.println(result);
결과 : 5234498.43776
위에서 언급 한 예제에 대한 매개 변수의 더 많은 옵션과 조합이 있습니다 (예를 들어, 6 가지 변형 방법이 있습니다).이 세트는 비 한정적인 목록이며 몇 가지 기본 예제를 포함합니다.
float 대신 BigDecimal 사용
플로트 유형이 컴퓨터 메모리에 표시되는 방식으로 인해이 유형의 연산 결과는 부정확 할 수 있습니다. 일부 값은 근사값으로 저장됩니다. 좋은 예는 화폐 계산입니다. 높은 정밀도가 필요한 경우 다른 유형을 사용해야합니다. Java 7은 BigDecimal을 제공합니다.
import java.math.BigDecimal;
public class FloatTest {
public static void main(String[] args) {
float accountBalance = 10000.00f;
System.out.println("Operations using float:");
System.out.println("1000 operations for 1.99");
for(int i = 0; i<1000; i++){
accountBalance -= 1.99f;
}
System.out.println(String.format("Account balance after float operations: %f", accountBalance));
BigDecimal accountBalanceTwo = new BigDecimal("10000.00");
System.out.println("Operations using BigDecimal:");
System.out.println("1000 operations for 1.99");
BigDecimal operation = new BigDecimal("1.99");
for(int i = 0; i<1000; i++){
accountBalanceTwo = accountBalanceTwo.subtract(operation);
}
System.out.println(String.format("Account balance after BigDecimal operations: %f", accountBalanceTwo));
}
이 프로그램의 출력은 다음과 같습니다.
Operations using float:
1000 operations for 1.99
Account balance after float operations: 8009,765625
Operations using BigDecimal:
1000 operations for 1.99
Account balance after BigDecimal operations: 8010,000000
출발 잔고가 10000.00 인 경우, 1.99에 대한 1000 회의 작업 이후에 우리는 잔액이 8010.00이 될 것으로 예상합니다. float 유형을 사용하면 8009.77에 대한 답변을 얻을 수 있습니다. 이는 금전적 계산의 경우 부정확하게 부정확합니다. BigDecimal을 사용하면 적절한 결과를 얻을 수 있습니다.
BigDecimal.valueOf ()
BigDecimal 클래스는 자주 사용되는 숫자의 내부 캐시 (예 : 0 ~ 10)를 포함합니다. BigDecimal.valueOf () 메서드는 비슷한 형식 매개 변수를 사용하는 생성자보다 우선적으로 제공됩니다. 즉, 아래 예에서는 a가 b보다 우선합니다.
BigDecimal a = BigDecimal.valueOf(10L); //Returns cached Object reference
BigDecimal b = new BigDecimal(10L); //Does not return cached Object reference
BigDecimal a = BigDecimal.valueOf(20L); //Does not return cached Object reference
BigDecimal b = new BigDecimal(20L); //Does not return cached Object reference
BigDecimal a = BigDecimal.valueOf(15.15); //Preferred way to convert a double (or float) into a BigDecimal, as the value returned is equal to that resulting from constructing a BigDecimal from the result of using Double.toString(double)
BigDecimal b = new BigDecimal(15.15); //Return unpredictable result
값 0, 1 또는 10의 BigDecimal의 초기화
BigDecimal는 숫자 0, 1 및 10에 대한 정적 속성을 제공합니다. 실제 숫자를 사용하는 대신에 이것을 사용하는 것이 좋습니다.
정적 속성을 사용하면 불필요한 인스턴스화를 피할 수 있으며 '마법 번호'대신 코드에서 리터럴을 사용할 수 있습니다.
//Bad example:
BigDecimal bad0 = new BigDecimal(0);
BigDecimal bad1 = new BigDecimal(1);
BigDecimal bad10 = new BigDecimal(10);
//Good Example:
BigDecimal good0 = BigDecimal.ZERO;
BigDecimal good1 = BigDecimal.ONE;
BigDecimal good10 = BigDecimal.TEN;