Bổ sung cho BigDecimal


155

Tôi muốn thực hiện một số tiền đơn giản với một số giá trị tiền tệ được thể hiện bằng BigDecimalloại.

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);

Rõ ràng là tôi không hiểu rõ về mỹ phẩm BigDecimal, xem đầu ra phía sau.

Test
0
0
0

Bất cứ ai có thể giúp tôi ra?

Câu trả lời:


275

Điều BigDecimalnày là bất biến nên bạn cần phải làm điều này:

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

27
Tôi có thể hiểu sự nhầm lẫn. Mặc dù tuyên bố rằng BigDecimal là bất biến, tài liệu có thể tốt hơn. Ví dụ: trạng thái tài liệu cho phương thức add(..): "gia tăng - giá trị được thêm vào BigDecimal này .". Hơn nữa, nói "... trả về một BigDecimal mới ..." thay vì "... trả lại một BigDecimal ..." sẽ là một cú chạm tuyệt vời. Có lẽ tôi chỉ là trò đùa, nhưng IMHO có chỗ để cải thiện ở đây :-)
pauluss86

3
Chỉ cần một lưu ý phụ, BigDecimal không hoàn toàn bất biến vì nó không phải là cuối cùng như Chuỗi ...
Zai

@Zai Nhưng đó chỉ là một lỗi thực thi, không phải do thiết kế. Mã duy trì không nên khai thác điều đó.
Chris Jester-Young

1
và tại sao việc triển khai Java lại hơi lạ?! nhiều ngôn ngữ khác chỉ cần sử dụng + giữa các loại dữ liệu số
sepehr

33

Có vẻ như từ các tài liệu Java ở đây có thêm trả về một BigDecimal mới:

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

Nó thực sự khá dễ dàng. Chỉ cần làm điều này:

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);

Xem thêm: BigDecimal#add(java.math.BigDecimal)


Thật thú vị khi câu trả lời của bạn giống hệt với Maurice Perry. Nếu bạn muốn thêm liên kết, bạn nên chỉnh sửa liên kết của mình.
forresthopkinsa

Trên thực tế, tôi đã không sao chép nó nhưng tôi nghĩ rằng cả hai chúng tôi đã viết cùng một câu trả lời cùng một lúc (dù sao đó cũng chỉ là bản sửa lỗi cho mã đã cho). Tôi chỉ mất một phút nữa để tìm kiếm các liên kết chính xác.
nfechner

Wow, thật thú vị!
forresthopkinsa

9

BigInteger là bất biến, bạn cần phải làm điều này,

  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

Bạn cũng có thể làm như thế này:

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);

Bản in:

A + B + C = 60000000000


1

Sử dụng lambdas Java8

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

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

Điều này bao gồm các trường hợp trong đó một số hoặc tất cả các đối tượng trong danh sách là null.


0
BigDecimal demo = new BigDecimal(15);

Nó là bất biến beacuse nó lưu trữ nội bộ bạn nhập, tức là (15) vì final private final BigInteger intVal; cùng một khái niệm sử dụng tại thời điểm tạo chuỗi, mọi đầu vào cuối cùng lưu trữ trong private final char value[];. Vì vậy, không có lỗi ngụ ý.


0

Chỉ cần một ví dụ khác để thêm BigDecimals. Điểm mấu chốt là chúng không thay đổi và chúng chỉ có thể được khởi tạo trong hàm tạo. Đây là mã:

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());
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.