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 ...を返す」と言ってもいいでしょう。たぶん私はただつまらないですが、私見ではここに改善の余地があります:-)
pauluss86

3
余談ですが、BigDecimalは、Stringのようにfinalではないため、完全に不変ではありません...
Zai

@Zaiしかし、これは実装上のバグであり、設計によるものではありません。保守可能なコードはそれを利用すべきではありません。
Chris Jester-Young

1
そして、なぜJavaの実装が少し奇妙なのですか?他の多くの言語では、数値データ型の間に+を使用するだけです
sepehr

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 16

実際、私はそれをコピーしませんでしたが、私たちは両方とも同じ答えを同時に書いたと思います(とにかく、与えられたコードの修正です)。正しいリンクを探すのに少し時間がかかった。
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);

プリント:

A + B + C = 60000000000


1

Java8ラムダの使用

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

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

これは、リスト内の一部またはすべてのオブジェクトがnullの場合をカバーします。


0
BigDecimal demo = new BigDecimal(15);

final private final BigInteger intVal; 文字列作成時の同じ概念の使用(15)が最終的にprivate final char value[];.Storeに格納されるため、 入力(つまり(15)を内部的に格納するため、不変 です。したがって、実装されたバグはありません。


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());
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.