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.