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?

Jawaban:


275

Itu BigDecimal tidak berubah sehingga Anda perlu melakukan ini:

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

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

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

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)


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

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

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


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.


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.


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());
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.