Доповнення для BigDecimal


155

Я хочу зробити прості суми з деякими значеннями валюти, вираженими в 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);

Очевидно, я не добре розумію BigDecimalарифметику, бачу вихід позаду.

Test
0
0
0

Хтось може мені допомогти?

Відповіді:


275

Це BigDecimalнезмінне, тому вам потрібно зробити це:

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

27
Я можу зрозуміти плутанину. Хоча заявлено, що BigDecimal незмінна, документація може бути кращою. Наприклад, в документі add(..)вказано метод : "augend - значення, яке потрібно додати до цього BigDecimal." Крім того, сказати "... повертає новий BigDecimal ..." замість "... повертає BigDecimal ..." було б приємним штрихом. Можливо, я просто заїдаю, але в IMHO тут є місце для вдосконалення :-)
pauluss86

3
Лише бічна примітка, BigDecimal не зовсім незмінна, оскільки не є остаточним, як String ...
Zai

@Zai Але це лише помилка реалізації, а не дизайн. Підтримуваний код не повинен це використовувати.
Кріс Єстер-Янг

1
і чому реалізація Java трохи дивна ?! багато інших мов просто використовують + між числовими типами даних
1616

33

Це схоже на документи Java, які тут додають, повертає новий 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

Насправді це досить просто. Просто зробіть це:

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

Дивитися також: BigDecimal#add(java.math.BigDecimal)


Цікаво, що ваша відповідь ідентична відповіді Моріса Перрі. Якщо ви хочете додати посилання, ви повинні були просто відредагувати його.
forresthopkinsa

Насправді я його не копіював, але думаю, що ми обидва написали одну й ту ж відповідь одночасно (це все одно просто виправлення даного коду). Я просто зайняв хвилину більше, щоб шукати правильне посилання.
nfechner

Ого, це досить цікаво!
forresthopkinsa

9

BigInteger незмінний, вам потрібно це зробити,

  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

Ви також можете зробити це так:

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

Друкує:

А + В + С = 60000000000


1

Використання лямбдів Java8

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

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

Це стосується випадків, коли деякі або всі об’єкти у списку є недійсними.


0
BigDecimal demo = new BigDecimal(15);

Це незмінне, оскільки воно внутрішньо зберігає ваш вхід, тобто (15), як final private final BigInteger intVal; і те саме використання концепції під час створення рядка, кожен вхід, нарешті, зберігається private final char value[];.


0

Просто ще один приклад, який потрібно додати BigDecimals. Ключовим моментом є те, що вони незмінні, і їх можна ініціалізувати лише в конструкторі. Ось код:

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());
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.