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

谁能帮我吗?

Answers:


275

BigDecimal所以你需要做的,这是不变的:

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

27
我能理解混乱。即使声明BigDecimal是不可变的,文档也可能会更好。例如,文档声明方法add(..):“ augend-要添加到此 BigDecimal的值”。此外,说“ ...返回一个新的 BigDecimal ...”而不是“ ...返回一个BigDecimal ...”将是一个不错的感觉。也许我只是在挑剔,但恕我直言,这里还有待改进的地方:-)
pauluss86 2014年

3
只是说明一下,BigDecimal并不是完全不变的,因为它不像String那样是最终的……
2014年

@Zai但这只是一个实现错误,并非设计使然。可维护的代码不应利用它。
克里斯·杰斯特·杨

1
为什么Java实现有点奇怪?许多其他语言仅在数字数据类型之间使用+
sepehr '16

33

这里的Java文档看来,add返回了一个新的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'5

哇,这很有趣!
forresthopkinsa'5

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

印刷品:

A + B + C = 60000000000


1

使用Java8 Lambda

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[];。因此,没有任何内在的bug。


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());
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.