BigDecimalがゼロより大きいか比較します


244

BigDecimal値がゼロより大きい場合、どうすれば比較できますか?


1
github.com/mortezaadi/bigdecimal-utilsを調べてください isPositive()メソッドがありますis(bigdecimal).isZero(); is(bigdecimal).notZero(); is(bigdecimal).isPositive(); //ゼロより大きいis(bigdecimal).isNegative(); //ゼロ未満is(bigdecimal).isNonPositive(); //ゼロ以下is(bigdecimal).isNonNegative();
モルテザアディ

以来@MortezaAdi BigDecimal実装Comparable比較機能が好きlt, le, eq, neに移動することがより良いですComparableUtils。そのため、Dateまたはカスタム型などの他のクラスに使用できます。
djmj

@djmj要件は実装を定義し、ComparableUtilsをビルドする必要も意図もありませんでした。lt、le、eqなどの機能に加えて、一般的な機能とはまったく異なります。
モルテザアディ

回答:


400

それは次のように簡単です:

if (value.compareTo(BigDecimal.ZERO) > 0)

ドキュメントではcompareTo実際には-1、0、または1が返されると指定されていますが、より一般的なComparable<T>.compareTo方法では、適切な3つのケースについてゼロ未満、ゼロ、またはゼロより大きいことが保証されるだけなので、通常はその比較に固執します。


50
警告の追加の単語が必要です。のvalue値がゼロであるがゼロ以外のスケールであると仮定します(たとえば、の0.00代わりに評価されます0)。あなたはおそらくそれがゼロに等しいと考えたいでしょう。compareTo()この方法は、確かにこれを行います。しかし、equals()メソッドはしません。 (別の証拠が必要な場合は、ロキまたは彼のアバターの1つが健在であり、ソフトウェア開発に移行したことを示しています。)
Andrew Spencer

9
これはJavaの慣用的な解決策であることに同意しますが、実際には読みやすいとは思いません。このような表現に出会うたびに、自分が正しい方法を持っていることを確信できるテストを書いていることに気づきます。おそらく、最近追加されたクラス(LocalDateincludeなど)isBeforeは、Oracleが同じように感じていることを示しています。理想的ではありませんが、ユーティリティisGreaterThanメソッドを作成する方が、このような状況では少し読みやすいと思います。
Mark Slater

@Jon Skeetソリューションは、値が0.00または0.0の場合にも機能しますか
アンジェリーナ

1
@Angelina:確かにそうなると思います-これらの値 0より大きくないので、0 compareToを返すと思います。しかし、心配なら、テストするのは簡単です。
Jon Skeet、2018年

@MarkSlater同意します。compareToは、Javaが読みやすさを向上させるためにより多くの時間を費やすべきであり、誰もがすべてのプロジェクトで独自の読み取り可能なメソッドを作成しなければならない場合に意味がありません。C#では、既存のクラスの拡張メソッドを作成して、 `value.isGreaterThen(foo)` `を直接使用することもできます
djmj

164

可能なより良い方法

if (value.signum() > 0)

12
BigDecimal.compareTo()は、最適化として符号を比較することから始まります。したがって、compareTo()を呼び出すのがおそらく最善の方法です。意図を明らかにし、余分なメソッド呼び出しのコストしかかかりません(とにかくインライン化されると思われます)。
Andrew Spencer

27
これは公開APIの一部です。それで、私にとっては、より良い方法です。符号が正(つまり、ゼロ)であるかどうかを決定する意図
Marc

String初期化さBigDecimalれた文字の最初の文字のみを取得して、-それがそうかどうかを確認すると、パフォーマンスが向上すると思いますか?それがどのように機能するかについての私の最良の推測です。実際に数値がかどうかを判断する方が速いよう0です。これは正しいです?アントン・ベッソノフさん、本当にありがとうございました!

5
逆コンパイルされたBigDecimal.compareTo()メソッドを見ると、signum()2回呼び出されていることがわかります。したがって、パフォーマンスに関しては、signum()より優れています。
MeIr

1
小数の場合の問題は何でしたか?@jfajunior
イスマイル・ヤウス


1

メソッドを使用する方が安全です compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

コンソール印刷

    result ==> 1

compareTo() 戻り値

  • aがbより大きい場合は1
  • bがbより小さい場合は-1
  • aがbと等しい場合は0

今あなたの問題のためにあなたは使うことができます

if (value.compareTo(BigDecimal.ZERO) > 0)

または

if (value.compareTo(new BigDecimal(0)) > 0)

お役に立てば幸いです。


0

BigDecimalオブジェクトで ".intValue()"を使用することは、そのゼロより大きいかどうかを確認する場合に正しくありません。残っている唯一のオプションは ".compareTo()"メソッドです。


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

objはヌマリック文字列を保持します。受け入れられた回答では、値が宣言されていないため、混乱する可能性があります。私の答えはより明確になります。
ラマクリシュナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.