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

我没有手动修改原始值,而是尝试应用一些条件,例如,

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条件检查小数部分的值是否为零。如果是这样,则截断它。该方法认为两个值相等但比例不同(如 2.0 和 2.00)的 BigDecimal 对象是相等的compareTo()。因此,只要小数部分的值被评估为零,就满足条件。

否则,原始值保持不变(如果比例为 1 或 2)。

如果我遗漏了一些东西或者实施起来是错误的,那么请澄清一下。

于 2013-03-23T20:58:07.123 回答
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 回答
0

试试这个:

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