四舍五入小数值时面临的问题

时间:2015-02-03 11:42:59

标签: java database bigdecimal

我们有一个页面从数据库中获取数据。一个领域" AmountEur"在显示在视图页面上之前是否正在四舍五入(使用bigdecimal.ROUND_HALF_UP方法)。

代码是这样的:

final Object amountEur = result.get("mtmAmountEUR");
if (amountEur != null) {
BigDecimal mtmAmt = ((BigDecimal) amountEur ).setScale(0,   BigDecimal.ROUND_HALF_UP);
result.put("mtmAmount", mtmAmt);
}

使用此代码,我面临一个问题。假设从db获取的数据是2650.5,那么视图页面中显示的数据仅为2650。理想情况下它应该是2651.另一方面,如果db中的数据是2650.55,它在视图页面上显示正常,即2651.我不知道我的代码有什么问题。 有人可以帮忙。

1 个答案:

答案 0 :(得分:0)

以下代码段:

    BigDecimal bd1=new BigDecimal("2650.499999");
    BigDecimal bd2=new BigDecimal("2650.5");
    BigDecimal bd3=new BigDecimal("2650.500001");


    BigDecimal rounded1=bd1.setScale(0,BigDecimal.ROUND_HALF_UP);
    BigDecimal rounded2=bd2.setScale(0,BigDecimal.ROUND_HALF_UP);
    BigDecimal rounded3=bd3.setScale(0,BigDecimal.ROUND_HALF_UP);

    System.out.println(bd1 + " -> " + rounded1);
    System.out.println(bd2 + " -> " + rounded2);
    System.out.println(bd3 + " -> " + rounded3);

产生预期的输出:

2650.499999 -> 2650
2650.5 -> 2651
2650.500001 -> 2651

setScale(.,.)实现的舍入逻辑存在误解或错误,这是一个更微妙的问题。

尝试打印出BigDecimal值,以确定您有2650.5而不是2650.499999,例如您使用数字(26,6)。