過去2日間で支払い額の確認を処理する際に問題がありました。 BigDecimalのEqualsメソッドを使用して、2つの量が等しいかどうかを比較するため、比較量(3.0と3.00の比較など)にエラーが発生しました。
[注:以下は、例としてSun JDKバージョン1.4.2に関するものです。他のバージョンの実装が一貫していない場合があります。無視してください]
まず、BigDecimalのEqualsメソッドをご覧ください。
public boolean equals(オブジェクトx){if(!(x instanceof bigdecimal))return false; bigdecimal xdec =(bigdecimal)x; return scale == xdec.scale && intval.equals(xdec.intval); }BigDecimalのEUQUALSメソッドは、最初に比較するデータ型を決定することであることがわかります。オブジェクトタイプが一貫している場合、精度(スケール)と値(Bigintegerの等しい方法)が一貫しているかどうか同時に決定されます。
実際、Javadocではすでに非常に明確です。「この大きなdecimalを平等の指定されたオブジェクトと比較します。比較とは異なり、この方法は、2つの大きなオブジェクトが値とスケールが等しい場合にのみ等しいと見なします(したがって、2.0はこの方法で比較された場合は2.00に等しくない)。」私はただ注意を払っていませんでした!
比較方法を見てみましょう。
public int compareto(bigdecimal val){/ *最適化:次の3行なしに正常に実行 */int sigdiff = signum() - val.signum(); if(sigdiff!= 0)return(sigdiff> 0? = val; matchscale(arg); return arg [0] .intval.compareto(arg [1] .intval); }この方法にはマッチスケール処理があることがわかります。これは、オブジェクトを低精度で高精度に変換し、それを比較することを意味します(Bigintegerの比較方法も)。マッチスケールの実装は次のとおりです。
private static void matchscale(bigdecimal [] val){if(val [0] .scale <val [1] .scale)val [0] = val [0] .setscale(val [1] .scale); else(val [1] .scale <val [0] .scale)= val [1]。 }簡単なテストを行います:
system.out.println(new bigdecimal( "1.2")。 // output falsesystem.out.println(new bigdecimal( "1.2")。比較(new bigdecimal( "1.20"))== 0); //出力true
また、上記のBigdecimalコンストラクターが弦で渡されていることに気付きました。数字が渡された場合、何が起こりますか?自分でテストして理由を分析できます。
system.out.println(new bigdecimal( "1.2")。 // output falsesystem.out.println(new bigdecimal( "1.2")。比較(new bigdecimal( "1.20"))== 0); // true system.out.println(new bigdecimal(1.2).equals(new bigdecimal( "1.20"))); //出力は?system.out.println(new bigdecimal(1.2).compareto(new bigdecimal( "1.20"))== 0); //出力ですか? system.out.println(new bigdecimal(1.2).equals(new bigdecimal(1.20))); //出力ですか? System.out.println(new bigdecimal(1.2).compareto(new bigdecimal(1.20))== 0); //出力ですか?
最終的な結論は、 BigDecimalのサイズ比較の場合、Equalsメソッドを使用すると、値のサイズを比較するだけでなく、2つのオブジェクトの精度を比較します。 Comparetoメソッドは、精度を比較するのではなく、値のサイズのみを比較します。
最後に、私は自分自身を軽spします。私は長年にわたってJava言語を使用してきましたが、基本的な常識さえ理解していません!
上記の記事では、BigDecimalの等しいとJavaの比較の違いについて簡単に説明しています。私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。