Tambahan untuk BigDecimal

155

Saya ingin melakukan beberapa penjumlahan sederhana dengan beberapa nilai mata uang yang dinyatakan dalam BigDecimaljenis.

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

Tentunya saya kurang mengerti dengan baik BigDecimalaritmatika, lihat output di belakang.

Test
0
0
0

Adakah yang bisa membantu saya?

Sergio del Amo
sumber

Jawaban:

275

Itu BigDecimal tidak berubah sehingga Anda perlu melakukan ini:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);
Vincent Ramdhanie
sumber
27
Saya bisa mengerti kebingungan. Meskipun dinyatakan bahwa BigDecimal tidak dapat diubah, dokumentasinya bisa lebih baik. Misalnya, status dokumen untuk metode add(..): "tambah - nilai yang akan ditambahkan ke BigDecimal ini .". Lebih jauh, mengatakan "... mengembalikan BigDecimal baru ..." alih-alih "... mengembalikan BigDecimal ..." akan menjadi sentuhan yang bagus. Mungkin aku hanya nitpicking, tapi IMHO ada ruang untuk perbaikan di sini :-)
pauluss86
3
Hanya catatan tambahan, BigDecimal tidak sepenuhnya sempurna karena tidak final seperti String ...
Zai
@Zai Tapi itu hanya bug implementasi, bukan karena desain. Kode yang dapat dipertahankan seharusnya tidak memanfaatkan itu.
Chris Jester-Young
1
dan mengapa implementasi Java agak aneh? banyak bahasa lain hanya menggunakan + antara tipe data numerik
sepehr
33

Sepertinya dari dokumen Java di sini yang menambahkan mengembalikan BigDecimal baru:

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);
Ankur Goel
sumber
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);
Maurice Perry
sumber
11

Ini sebenarnya agak mudah. Lakukan saja ini:

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

Lihat juga: BigDecimal#add(java.math.BigDecimal)

neknik
sumber
Menarik bahwa jawaban Anda identik dengan jawaban Maurice Perry. Jika Anda ingin menambahkan tautan, Anda harus mengeditnya.
forresthopkinsa
Sebenarnya, saya tidak menyalinnya tetapi saya pikir kami berdua menulis jawaban yang sama pada saat yang sama (itu hanyalah perbaikan untuk kode yang diberikan pula). Saya hanya butuh beberapa menit lebih lama untuk mencari tautan yang benar.
nfechner
Wow, itu cukup menarik!
forresthopkinsa
9

BigInteger tidak dapat diubah, Anda perlu melakukan ini,

  BigInteger sum = test.add(new BigInteger(30));  
  System.out.println(sum);
ZZ Coder
sumber
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
MAK
sumber
3
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20

Yatish
sumber
2

Anda juga dapat melakukannya seperti ini:

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

Cetakan:

A + B + C = 60000000000

Artur Krawczyk
sumber
1

Menggunakan Java8 lambdas

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

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

Ini mencakup kasus-kasus di mana beberapa atau semua objek dalam daftar adalah nol.

DaithiG
sumber
0
BigDecimal demo = new BigDecimal(15);

Itu tidak dapat diubah karena secara internal menyimpan input Anda yaitu (15) seperti final private final BigInteger intVal; dan konsep yang sama digunakan pada saat penciptaan string setiap input akhirnya menyimpan di private final char value[];. Jadi tidak ada bug yang ditanamkan.

Snipersnack
sumber
0

Contoh lain untuk ditambahkan BigDecimals. Poin kunci adalah bahwa mereka tidak dapat diubah dan mereka hanya dapat diinisialisasi dalam konstruktor. Ini kodenya:

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());
    }
}
Paolo Leoncini
sumber