考虑所有数字的四舍五入

时间:2019-07-02 15:20:58

标签: java rounding

在Java代码中,我有1个输入是:16275.874999999998

我构建了一种将其四舍五入为16275.87的方法

但是正确的答案是:16275.88

如何在Java中修复该问题?

我当前的舍入方法:

public static double round(final double value, final int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = BigDecimal.valueOf(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

编辑:我认为“正确的答案”为.88,因为9会四舍五入,但我使用的方法并非如此,肯定会考虑将其重写以考虑先前的小数点。

非常感谢大家的答复!

2 个答案:

答案 0 :(得分:1)

Java实际上正在正确舍入您的数字。由于要舍入到2位,因此setScale方法将在示例中查看第三个小数点,即4。由于4 <5,您的HALF_UP舍入模式将表现为ROUND_DOWN,这就是为什么您的输出为16275.87而不是16275.88

的原因

为了使您的数字四舍五入到16275.88,您需要使用输入export default new Router({ mode: 'history', base: process.env.BASE_URL, routes: [{ path: '/', name: 'login', component: Login, }, { path: '/home', component: Container, children: [ { // LEAVE THIS PATH BLANK. Matches /home path: '', name: 'home', component: HomeComponent, }, { path: 'another-route', name: 'nested-route', component: AnotherComponent, } ] }, ], }); 来运行方法

答案 1 :(得分:1)

如果您希望始终取整,则需要使用RoundingMode.CEILINGRoundingMode.UP(取决于您希望负数如何表现),而不要使用RoundingMode.HALF_UP

    bd = bd.setScale(places, RoundingMode.CEILING);

HALF_UP将舍去小数点后第一个小数点后等于或大于5的内容,而舍入小于该值的小于5的内容。

CEILINGUP将始终四舍五入为正数,因此16275.871将四舍五入为16275.88。两者之间的区别在于它们处理负数的方式。 CEILING会四舍五入为正数,而UP会四舍五入为较大的负数。

CEILING of -16275.871 = -16275.871
UP of -16275.871 = -16275.88