当Java中的比例为零时,截断BigDecimal的小数部分

时间:2013-03-23 18:41:05

标签: java bigdecimal

当其标度值为零时,我需要删除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 个答案:

答案 0 :(得分: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);

}

输出:

  

如果我们看到此消息没有例外,一切正常

答案 1 :(得分: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,我认为这是想要的功能。

答案 2 :(得分: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);

如果比例大于2,则第一个if条件检查。如果是,则执行指定的舍入操作。

如果小数部分的值为零,则下一个if条件检查。如果是,则截断它。两个BigDecimal对象的值相等但具有不同的比例(如2.0和2.00)被compareTo()方法视为相等。因此,只要将小数部分的值评估为零,就满足条件。

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

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

答案 3 :(得分:0)

试试这个:

new BigDecimal("12.3456").setScale(2, RoundingMode.FLOOR).stripTrailingZeros()