2

BigDecimalスケールの値がゼロの場合、値の小数部分を削除する必要があります。例えば、

BigDecimal value = new BigDecimal("12.00").setScale(2, RoundingMode.HALF_UP);

を割り当て12.00ます。12そんな時だけに割り当てて欲しいですvalue


BigDecimal value = new BigDecimal("12.000000").setScale(2, RoundingMode.HALF_UP);

を割り当てる必要があります12


BigDecimal value = new BigDecimal("12.0001").setScale(2, RoundingMode.HALF_UP);

を割り当てる必要があり12ます。


BigDecimal value = new BigDecimal("12.0051").setScale(2, RoundingMode.HALF_UP);

割り当てる必要があります12.01


BigDecimal value = new BigDecimal("00.000").setScale(2, RoundingMode.HALF_UP);

を割り当てる必要があり0ます。


BigDecimal value = new BigDecimal("12.3456").setScale(2, RoundingMode.HALF_UP);

割り当てる必要が12.35あります。これは可能ですか?最善の方法は何ですか?

4

4 に答える 4

6

そこからのクロスリンクについては、https://codereview.stackexchange.com/questions/24299/is-this-the-way-of-truncating-the-fractional-part-of-a-bigdecimal-when-its-scale

これは可能ですか?最善の方法は何ですか?

おそらくstripTrailingZeros()

テストを確認するには:

public static void main(final String[] args) {
    check(truncate("12.000000"), "12");
    check(truncate("12.0001"), "12");
    check(truncate("12.0051"), "12.01");
    check(truncate("12.99"), "12.99");
    check(truncate("12.999"), "13");
    check(truncate("12.3456"), "12.35");
    System.out.println("if we see this message without exceptions, everything is ok");
}

private static BigDecimal truncate(final String text) {
    BigDecimal bigDecimal = new BigDecimal(text);
    if (bigDecimal.scale() > 2)
        bigDecimal = new BigDecimal(text).setScale(2, RoundingMode.HALF_UP);
    return bigDecimal.stripTrailingZeros();
}

private static void check(final BigDecimal bigDecimal, final String string) {
    if (!bigDecimal.toString().equals(string))
        throw new IllegalStateException("not equal: " + bigDecimal + " and " + string);

}

出力:

例外なくこのメッセージが表示されれば、すべて問題ありません。

于 2013-03-25T00:00:37.373 に答える
1

次のコードは、正規表現との構築を使用して指定したことを実行しますBigDecimal。これは、おそらく最も効率的な方法ではありません。

    BigDecimal value = new BigDecimal("12.0000").setScale(2, RoundingMode.HALF_UP);
    Pattern pattern = Pattern.compile("\\d+\\.(\\d)0");
    Matcher matcher = pattern.matcher(value.toString());
    if (matcher.find()) {
        if (matcher.group(1).equals("0")) 
            value = value.setScale(0);
        else
            value = value.setScale(1);
    }

注:これにより、12.100-> 12.1にもなります。これは、必要な機能であると思います。

于 2013-03-23T19:33:32.670 に答える
1

元の値を自分で変更するのではなく、次のような条件を適用しようとしました。

String text="123.008";
BigDecimal bigDecimal=new BigDecimal(text);

if(bigDecimal.scale()>2)
{
    bigDecimal=new BigDecimal(text).setScale(2, RoundingMode.HALF_UP);
}

if(bigDecimal.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO)==0)
{
    bigDecimal=new BigDecimal(text).setScale(0, BigDecimal.ROUND_HALF_UP);
}

System.out.println("bigDecimal = "+bigDecimal);

最初のif条件は、スケールが2より大きいかどうかをチェックします。大きい場合は、指定されたとおりに丸め操作を実行します。

次のif条件は、小数部の値がゼロになるかどうかをチェックします。もしそうなら、それを切り捨てます。compareTo()値は等しいがスケールが異なる(2.0と2.00など)2つのBigDecimalオブジェクトは、メソッドによって等しいと見なされます。したがって、小数部の値がゼロと評価されるときはいつでも条件が満たされます。

それ以外の場合、元の値は変更されません(スケールが1または2の場合)。

何かが足りない、または実装が間違っている場合は、それを明確にしてください。

于 2013-03-23T20:58:07.123 に答える
0

これを試してください:

new BigDecimal("12.3456").setScale(2, RoundingMode.FLOOR).stripTrailingZeros()
于 2014-03-13T13:39:01.140 に答える