BigDecimal에 대한 추가


155

BigDecimal유형으로 표시된 일부 통화 값으로 간단한 합계를 원합니다 .

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test.add(new BigDecimal(30));
System.out.println(test);
test.add(new BigDecimal(45));
System.out.println(test);

분명히 나는 BigDecimal산술을 잘 이해하지 못합니다 . 출력 결과를 참조하십시오.

Test
0
0
0

누구든지 나를 도울 수 있습니까?

답변:


275

BigDecimal이 작업을 수행 할 수 있도록 변경할 수 없습니다 :

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);

27
혼란을 이해할 수 있습니다. BigDecimal을 변경할 수 없다고 명시되어 있지만 문서가 더 나을 수 있습니다. 예를 들어, 메소드의 문서 상태는 add(..)"augend- BigDecimal에 추가 될 값 "입니다. 또한, 말을 "... 반환 새로운 대신 ... BigDecimal를"을 "... 반환을 BigDecimal ..."멋진 터치 될 것이다. 아마도 나는 nitpicking
일지

3
참고로, BigDecimal은 String처럼 최종적이지 않기 때문에 완전히 변할 수 없습니다 ...
Zai

@Zai 그러나 이것은 디자인이 아니라 구현 버그 일뿐입니다. 유지 관리 가능한 코드는이를 악용해서는 안됩니다.
Chris Jester-Young

1
그리고 왜 Java 구현이 조금 이상합니까?! 다른 많은 언어들은 단순히 숫자 데이터 유형 사이에 +를 사용합니다
sepehr

33

그것은 자바 문서에서처럼 보이는 이곳 이 추가 반환 새로운 BigDecimal를 :

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

16
BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

11

실제로 오히려 쉽습니다. 그냥 이렇게 :

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

또한보십시오: BigDecimal#add(java.math.BigDecimal)


귀하의 답변이 Maurice Perry와 동일하다는 점에 흥미가 있습니다. 링크를 추가하려면 방금 링크를 편집해야합니다.
forresthopkinsa

실제로, 나는 그것을 복사하지 않았지만 우리는 동시에 같은 대답을 썼다고 생각합니다 (어쨌든 주어진 코드의 수정 일뿐입니다). 올바른 링크를 찾는 데 시간이 조금 더 걸렸습니다.
nfechner

와우, 꽤 재밌어요!
forresthopkinsa

9

BigInteger는 변경할 수 없습니다. 이렇게해야합니다.

  BigInteger sum = test.add(new BigInteger(30));  
  System.out.println(sum);

4
//you can do in this way...as BigDecimal is immutable so cant set values except in constructor

BigDecimal test = BigDecimal.ZERO;
BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);

result would be 30

3
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20


2

다음과 같이 할 수도 있습니다 :

BigDecimal A = new BigDecimal("10000000000");
BigDecimal B = new BigDecimal("20000000000");
BigDecimal C = new BigDecimal("30000000000");
BigDecimal resultSum = (A).add(B).add(C);
System.out.println("A+B+C= " + resultSum);

인쇄물:

A + B + C = 60000000000


1

Java8 람다 사용

List<BigDecimal> items = Arrays.asList(a, b, c, .....);

items.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);

여기에는 목록의 일부 또는 모든 객체가 null 인 경우가 포함됩니다.


0
BigDecimal demo = new BigDecimal(15);

내부적으로 입력을 저장하므로 (15) final private final BigInteger intVal; 문자열 생성시 동일한 개념 사용과 모든 입력이 마침내 저장됩니다. private final char value[];따라서 함축적 인 버그가 없습니다.


0

추가 할 또 다른 예 BigDecimals입니다. 요점은 변경할 수 없으며 생성자에서만 초기화 할 수 있다는 것입니다. 코드는 다음과 같습니다.

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc;
        boolean first_right_number = false;
        BigDecimal initBigDecimal = BigDecimal.ZERO;
        BigDecimal add1 = BigDecimal.ZERO;
        BigDecimal add2 = BigDecimal.ZERO;

        while (!first_right_number)
        {
            System.out.print("Enter a first single numeric value: ");
            sc = new Scanner(System.in);
            if (sc.hasNextBigDecimal()) 
            {
                first_right_number = true;
                add1 = sc.nextBigDecimal();
            }
        }

        boolean second_right_number = false;
        while (!second_right_number)
        {
            System.out.print("Enter a second single numeric value: ");
            sc = new Scanner(System.in);
            if (sc.hasNextBigDecimal()) 
            {
                second_right_number = true;
                add2 = sc.nextBigDecimal();
            }
        }
        BigDecimal result = initBigDecimal.add(add1).add(add2);
        System.out.println("Sum of the 2 numbers is: " + result.toString());
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.