Проблемы, возникающие при округлении большого десятичного значения

У нас есть одна страница, на которой мы извлекаем данные из базы данных. есть одно поле «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. С другой стороны, если данные 2650,55 в БД, они отображаются нормально на странице просмотра, т.е. 2651. Я не знаю, в чем проблема с моим кодом. Может кто-нибудь, пожалуйста, помогите.


person user2326831    schedule 03.02.2015    source источник
comment
Попробуйте stackoverflow.com/questions/3843440/ . Это может указать вам направление решения самостоятельно.   -  person user1628658    schedule 03.02.2015
comment
result.get(...) от ResultSet? Если да, используйте result.getBigDecimal()   -  person Steffen    schedule 03.02.2015
comment
используйте BigDecimal.ROUND_CEILING и проверьте   -  person Prashant    schedule 03.02.2015
comment
Нет результата - это просто объект карты   -  person user2326831    schedule 03.02.2015
comment
Выведите значение (BigDecimal) amountEur, чтобы убедиться, что оно действительно точное 2650.5. Думаю, меньше.   -  person SubOptimal    schedule 03.02.2015
comment
Нет результата - это просто объект карты. и тип данных, используемый для хранения этой переменной суммы в базе данных, — NUMBER (21,6). Что-то вроде этого ; for (final Map‹String, Object› результат: searchResult.getResult()) { // код здесь }   -  person user2326831    schedule 03.02.2015


Ответы (1)


Следующий фрагмент:

    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).

person Persixty    schedule 03.02.2015