Проблемы точности Java при получении числа из базы данных Oracle - неправильно округляются

1

Я запускаю веб-приложение JSP, которое извлекает числовое значение из базы данных Oracle и отображает его на веб-странице. Я вручную ввел значение 2929.2, и запрос базы данных вручную подтверждает, что он хранится в качестве этого значения. Когда я получаю его через JSP, он отображается как 2929.199951172. Как я могу это исправить? Я использую ResultSets и метод getDouble(). Он хранится в Oracle как плавающий, но... и помиловал мою нообильность - из моего понимания, которое имеет такую же точность, как Java double, и getFloat() не то, что я ищу.

Я просмотрел несколько статей о BigDecimal, но я не решаюсь изменить все, если не знаю, что мне нужно.

  • 2
    Ну, вам нужен BigDecimal потому что это его цель: обработка полей в базе данных с точной точностью для значений с плавающей запятой.
  • 0
    Используйте BigDecimal и, возможно, прочитайте « Что должен знать каждый компьютерный ученый» об арифметике с плавающей запятой (и если вы не можете этого соблюдать, хотя бы прочитайте о правилах округления ieee-754 ).
Показать ещё 2 комментария
Теги:
jsp
bigdecimal
precision

1 ответ

1

Вы должны использовать BigDecimal потому что его цель: обрабатывать значения с плавающей запятой с произвольной точностью. Из BigDecimal javadoc:

Неизменяемые знаковые числа с произвольной точностью. BigDecimal состоит из произвольного значения целочисленного целочисленного значения точности и 32-разрядной целочисленной шкалы.

Этот тип сильно используется при получении данных из полей DECIMAL (или NUMERIC) из базы данных, поскольку позволяет поддерживать точность значения, хранящегося в базе данных. Это специально используется в финансовых приложениях/операциях.

Кстати, вы также должны изменить тип, используемый в вашей базе данных Oracle, от FLOAT до DECIMAL.

Я не решаюсь изменить все, если не знаю, что мне нужно

Если вам нужно/нужно правильно обрабатывать эти числовые значения, вы должны изменить все на BigDecimal.

  • 0
    Спасибо за вклад. К сожалению, это большое корпоративное хранилище данных, и я не смогу изменить его на десятичное. Кроме того, мне приходится обходить множество плохих дизайнерских решений, представленных большой программой с открытым исходным кодом, которую я расширяю (в частности, JTrac). Мы используем его намного больше, чем было задумано, и он хранит все как двойные числа - изменение, которое будет капитальным ремонтом, которое затронет гораздо больше, чем просто мой маленький уголок. Я не пытаюсь быть трудным, и я ценю обратную связь, но есть ли другие исправления?
  • 0
    @slothario Нет, тебе не повезло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню