Java BigDecimal:四舍五入到最接近的整数值

Java BigDecimal:四舍五入到最接近的整数值,java,rounding,bigdecimal,Java,Rounding,Bigdecimal,我需要以下结果 100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 .圆形还是.固定刻度?如何执行此操作?您可以使用setScale将小数位数减少到零。假设值保留要舍入的值: BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP); System.out.println(value + " -> " + scaled)

我需要以下结果

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.圆形还是.固定刻度?如何执行此操作?

您可以使用setScale将小数位数减少到零。假设值保留要舍入的值:

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
使用round有点复杂,因为它需要您指定要保留的位数。在您的示例中,这将是3,但并非对所有值都有效:

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

请注意,BigDecimal对象是不可变的;setScale和round都将返回一个新对象。

我不认为您可以在一个命令中对其进行那样的舍入。试一试

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

我测试了您剩下的示例,它返回了想要的值,但我不能保证它的正确性。

这里有一个非常复杂的解决方案,但它可以工作:

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}
测试代码:

输出:

一百 100 101 101

你想要

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP
简单看一下:

以及:

或者如果使用Java6,那么

以及:

setScale(int precision, RoundingMode mode);
round(MathContext mc);

如果我接受格罗德里格斯的回答

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
这是输出

100.23 -> 100
100.77 -> 101
这不是我想要的,所以我最终做了这个

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
这就是我得到的

100.23 -> 100.00
100.77 -> 101.00
这就解决了我目前的问题..:
谢谢大家。

它不起作用:100.12:100.12100.44:100.44100.50:100.5100.75:100.75不,设置小数点后返回的新小数点与第一个小数点不同。例如:BigDecimalBD1=新的BigDecimal100.12;BigDecimal bd2=bd1.setScale0,舍入模式.HALF_向上;System.out.printlnbd1.equalsbd2;印刷品false@Daniel:我在回答中发布的代码片段中已经暗示了这一点。我现在已经说得很清楚了。RoundingMode那是什么?这很重要,他什么都不做。根据round的文档:如果精度设置为0,则不会进行取整。我很好奇第一个结果不是我想要的。。。。如果您确实关心输出格式,可以使用DecimalFormat,如new DecimalFormat.00中所述,来管理将BigDecimal转换回字符串的过程。对于@Grodriquez代码段和您创建的两个值,结果都是101.00。第二次在这里取整是不必要的,因为您知道您已经有一个整数了,所以我会使用BigDecimal.ROUND_,这在我看来是不必要的,更清楚一点。我不赞同这个解决方案或任何东西,但是input.toBigInteger.toString.length部分使用对数会更有效,如果input是十的幂,则类似于round_uploginput+1,否则为0
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
100.23 -> 100.00
100.77 -> 101.00