BigDecimal için Toplama


155

Bazı para birimi değerleri ile ifade edilen bazı basit tutarlar yapmak istiyorum 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);

Açıkçası BigDecimalaritmetiği iyi anlamıyorum , arkasındaki çıktıya bakın.

Test
0
0
0

Biri bana yardım edebilir mi?

Yanıtlar:


275

BigDecimalBunu yapmak gerekir, böylece değiştirilemez:

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

27
Karışıklığı anlayabiliyorum. BigDecimal'in değişmez olduğu belirtilse de, belgeler daha iyi olabilir. Örneğin, docs yöntemi için kullanılır add(..): "augend - bu BigDecimal'a eklenecek değer .". Dahası, diyerek "... bir döndüren yeni yerine ... BigDecimal" "... getiriler bir BigDecimal ..." hoş bir dokunuş olurdu. Belki sadece nitpicking, ama IMHO burada iyileştirilmesi için yer var :-)
pauluss86

3
Sadece bir yan not, BigDecimal String gibi son değil gibi tamamen değişmez ...
Zai

@Zai Ama bu sadece bir tasarım hatası değil, bir uygulama hatası. Sürdürülebilir kod bundan yararlanmamalıdır.
Chris Jester-Young

1
ve Java uygulaması neden biraz garip ?! diğer birçok dil sadece sayısal veri türleri arasında + kullanır
sepehr

33

Buradaki Java dokümanlarından yeni bir BigDecimal döndüren gibi görünüyor :

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

Aslında oldukça kolay. Sadece bunu yap:

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

Ayrıca bakınız: BigDecimal#add(java.math.BigDecimal)


Cevabınızın Maurice Perry'ninkiyle aynı olması ilginç. Eğer bağlantıyı eklemek istediysen, sadece onu düzenlemeliydin.
forresthopkinsa

Aslında, ben kopyalamadı ama ben ikimiz de aynı anda aynı cevabı yazdık düşünüyorum (bu zaten verilen kod için sadece düzeltme). Doğru bağlantıya bakmam bir dakika sürdü.
nfechner

Vay canına, bu oldukça ilginç!
forresthopkinsa

9

BigInteger değişmez, bunu yapmanız gerekiyor,

  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

Bunu şu şekilde de yapabilirsiniz:

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

Baskılar:

A + B + C = 60000000000


1

Java8 lambdas kullanma

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

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

Bu, listedeki nesnelerin bir kısmının veya tamamının boş olduğu durumları kapsar.


0
BigDecimal demo = new BigDecimal(15);

Bu dahili olarak size giriş yani (15) olarak saklamak değişmez final private final BigInteger intVal; ve dize oluşturma sırasında aynı konsept kullanımı sonunda her giriş nihayet saklar. private final char value[];Yani implmented bir hata yoktur.


0

Eklemek için başka bir örnek BigDecimals. Kilit nokta, değişmez olmaları ve sadece yapıcıda başlatılabilmeleridir. İşte kod:

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());
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.