수색…


소개

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 나누기에 ScaleRounding 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;


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow