在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会四舍五入,但我使用的方法并非如此,肯定会考虑将其重写以考虑先前的小数点。
非常感谢大家的答复!
答案 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.CEILING
或RoundingMode.UP
(取决于您希望负数如何表现),而不要使用RoundingMode.HALF_UP
bd = bd.setScale(places, RoundingMode.CEILING);
HALF_UP
将舍去小数点后第一个小数点后等于或大于5的内容,而舍入小于该值的小于5的内容。
CEILING
和UP
将始终四舍五入为正数,因此16275.871将四舍五入为16275.88。两者之间的区别在于它们处理负数的方式。 CEILING
会四舍五入为正数,而UP
会四舍五入为较大的负数。
CEILING of -16275.871 = -16275.871
UP of -16275.871 = -16275.88