Aggiunta per BigDecimal


155

Voglio fare alcune somme semplici con alcuni valori di valuta espressi in BigDecimaltipo.

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

Ovviamente non capisco bene l' BigDecimalaritmetica, vedi l'output dietro.

Test
0
0
0

Qualcuno può darmi una mano?

Risposte:


275

Il BigDecimalè immutabile, quindi è necessario fare questo:

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

27
Posso capire la confusione. Anche se si afferma che BigDecimal è immutabile, la documentazione potrebbe essere migliore. Ad esempio, i documenti indicano il metodo add(..): "augend - valore da aggiungere a questo BigDecimal.". Inoltre, dire "... restituisce un nuovo BigDecimal ..." invece di "... restituisce un BigDecimal ..." sarebbe un bel tocco. Forse sto solo scherzando, ma IMHO c'è spazio per miglioramenti qui :-)
pauluss86

3
Solo una nota a margine, BigDecimal non è completamente immutabile in quanto non è definitivo come String ...
Zai

@Zai Ma questo è solo un bug di implementazione, non di progettazione. Il codice mantenibile non dovrebbe sfruttarlo.
Chris Jester-Young,

1
e perché l'implementazione Java è un po 'strana ?! molte altre lingue usano semplicemente + tra tipi di dati numerici
sepehr

33

Sembra dai documenti Java qui che aggiungi restituisce un nuovo 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

In realtà è piuttosto semplice. Basta fare questo:

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

Guarda anche: BigDecimal#add(java.math.BigDecimal)


Interessante che la tua risposta sia identica a quella di Maurice Perry. Se volessi aggiungere il link, avresti dovuto modificare il suo.
forresthopkinsa,

In realtà, non l'ho copiato, ma penso che entrambi abbiamo scritto la stessa risposta allo stesso tempo (è comunque semplicemente la correzione per il codice dato). Ho impiegato solo un minuto in più per cercare il link corretto.
nfechner

Wow, è piuttosto interessante!
forresthopkinsa

9

BigInteger è immutabile, devi farlo,

  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

Puoi anche farlo in questo modo:

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

stampe:

A + B + C = 60000000000


1

Utilizzo di Java8 lambdas

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

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

Questo copre i casi in cui alcuni o tutti gli oggetti nell'elenco sono nulli.


0
BigDecimal demo = new BigDecimal(15);

È immutabile perché memorizza internamente l'input, ovvero (15) final private final BigInteger intVal; e lo stesso concetto usa al momento della creazione della stringa ogni input infine memorizza in private final char value[];. Quindi non c'è alcun bug impiantato.


0

Solo un altro esempio da aggiungere BigDecimals. Il punto chiave è che sono immutabili e possono essere inizializzati solo nel costruttore. Ecco il codice:

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());
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.