BigDecimal 的加法

我想用 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

有人能帮帮我吗?

267900 次浏览

BigInteger 是不可变的,你必须这么做,

  BigInteger sum = test.add(new BigInteger(30));
System.out.println(sum);
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是不可变的,所以你需要这样做:

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

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

其实很简单,只要这样做:

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)

//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
BigDecimal no = new BigDecimal(10); //you can add like this also
no = no.add(new BigDecimal(10));
System.out.println(no);

20

BigDecimal demo = new BigDecimal(15);

它是不可变的,因为它在内部将您的输入存储为 final private final BigInteger intVal;,即(15) 在字符串创建时使用相同的概念,每个输入最终存储在 所以没有实现的 bug。

这只是另一个添加 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());
}
}

你也可以这样做:

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 = 6000000000

使用 Java8 lambdas

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


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

这涵盖了列表中的部分或全部对象为空的情况。

BigInteger 是不可变的,就像 String 一样。 这意味着一旦创建了对象,我们就不能更改它的内容,但是我们可以重新分配它。

 BigInteger sum = test.add(new BigInteger(30));
System.out.println(sum);

. add ()将返回一个新的 Object