BigDecimalの紹介
JDKドキュメント(中国語)の説明は次のとおりです。
不変の署名された10進数の任意の精度。 Bigdecimalは、精度の整数非スケール値と32ビット整数スケールで構成されています。ゼロまたは正の場合、スケールは小数点後の数字数です。負の数の場合、数の非スケーリング値に10の負のパワーを掛けます。
具体的な説明
1。 "Bigdecimalオブジェクトの値は不変です」。これは、BigDecimalオブジェクトの動作関数にこの機能を示しています。
コードコピーは次のとおりです。bigdecimala = new bigdecimal( "1.22");
System.out.println( "文字列値を持つコンストラクト:" + a);
BigDecimal B = new BigDecimal( "2.22");
A.Add(b);
System.out.println( "プラスBは:" + a);
出力すると考えるのは簡単です:
StringValueを使用して構築:1.22
プラスBは次のとおりです。3.44
しかし、実際にはプラスBは次のとおりです。1.22
2。「Bigdecimalは、精度と32ビットの整数スケールの整数非スケール値で構成されています。スケール値がゼロまたは正の場合、スケールは小数点後の数字数です。」この文は次のように読むことができます:
例:-12および13.412
表現:-12×10-0および13412×10-3
ここで(非スケーリング値とスケール)は、それぞれ[-12、0]および[13412、3]として表されます。
3。 "スケール値が負の数である場合、数の非スケール値に10"の負のスケールパワーを掛けます。この文は次のように読むことができます:
例:120.00
この値は、12000×10-2として表されます
ここで(非スケール値とスケール)は次のように表されます。[12000、2]
ここでのスケールの値はまだ正です2ですが、次の操作を実行します。
bigdecimal量= new bigdecimal( "-120.00");
//この小数に等しい大きな数値を返しますが、この表現からすべてのテールゼロを削除します。
金額=額。striptrailingzeros();
この値は次のように表されます:12×10 - ( - 1)
ここで(非スケール値とスケール)は次のように表されます:[12、-1]
使用に関するメモ
1。コンストラクター
コードコピーは次のとおりです。bigdecimaladouble = new bigdecimal(1.22);
system.out.println( "double value:" + adouble);
bigdecimal astring = new bigdecimal( "1.22");
system.out.println( "文字列値を持つコンストラクト:" +アストリング);
出力の結果は次のとおりです。
ダブル値を使用した構築:1.219999999999999999999733546474089962430298328399658203125
文字列値で構成:1.22
JDKの説明:
a)パラメータータイプダブルの構造方法の結果は予測不可能です。一部の人々は、JavaでNewbigdecimal(0.1)を書くことで作成された大きなdecimalは、0.1(スケールは1である非スケーリング値1)に正確に等しいと考えるかもしれませんが、実際には0.1000000000000000000000000000000000000555111512312578270218158340441015625。これは、0.1を二重として正確に表現できないためです(または、この場合、有限長のバイナリ10進数として表すことはできません)。このようにして、建設方法に渡された値は0.1に正確に等しくなりません(ただし、その値に等しくなります)。
b)一方、文字列コンストラクターは完全に予測可能です。Newbigdecimal( "0.1")への書き込みは、正確に予想される0.1です。したがって、比較して、最初に文字列コンストラクターを使用することをお勧めします。
c)二重をBigDecimalのソースとして使用する必要がある場合、このコンストラクターが正確な変換を提供することに注意してください。次の結果と同じ結果を提供しません:最初にdouble.tostring(double)メソッドを使用してから、BigDecimal(String)コンストラクターを使用します。 doubleを文字列に変換するには、stringの静的方法:string.valueof(double)を使用することもできます。
2。操作。追加、減算、乗算、および分割は、実際には新しいBigDecimalオブジェクトを返します。なぜなら、BigDecimalは不変であり、操作の各ステップを実行するときに新しいオブジェクトが生成されるため、A.Add(b);追加操作は実行されますが、Aは追加操作後の値を節約しません。正しい使用法はa = a.add(b)でなければなりません。
例:
Bigdecimalオブジェクトが整数であるかどうかを判断します。
コードを次のようにコピーします:private boolean isintegervalue(bigdecimal bd){
bd.signum()== 0 ||を返しますbd.scale()<= 0 || bd.Striptrailingzeros()。scale()<= 0;
}
なぜこれをするのですか?次の例をテストしてください。
コードを次のようにコピーします:BigDecimal額= new BigDecimal( "-120.00"); //それぞれ「0」、「0.00」、「1.00」、「10.00」、「10.10」を試してください
system.out.println(amolt.signum()); //ポジティブおよびネガティブ
system.out.println(antable.scale()); //規模
system.out.println(amolt.striptrailingzeros()。scale()); //ゼロ後のスケール
参照:クラスBigDecimal