Страницы

Поиск по вопросам

понедельник, 11 февраля 2019 г.

При преобразовании String с дробными числами теряется информация

Столбец excel содержит числа в диапазоне от 1 до 0.0001. Когда оператор в ручную делает суммирование стобца примерно из 10-30 строк получается число 15,028
Я делаю автоматизацию. Мне в программу приходят данные из БД ОРАКЛ. Информация приходит в виде строк. Я преобразую строки в тип Double и суммирую. Сумма тех же строк дает у меня 13,9
Может ли Double округлять значения из-за чего информация теряется и как с этим бороться?
for (String[] rowx : СписокмассивовстрокИзОракл) { String key = "комбинация данных по логике автоматизации"; try { if (mapMass.containsKey(key)) { try { double src = 0.0; try { src = Double.valueOf(rowx[timeFakt]); //косяк, данные хранящиеся в ячейке timeFakt могут быть типа 0,0028 или 0,0000034. и они округляются. } catch (Exception e) { e.printStackTrace(); } total = Double.valueOf(mapMassTwo.get(key)) + src; String tf = String.valueOf(total); mapMassTwo.put(key, tf); total = 0.0; } catch (Exception e) { e.printStackTrace(); } } else { String tf = rowx[timeFakt]; mapMass.put(key, tf ); } } catch (Exception e) { e.printStackTrace(); } }


Ответ

Да, вполне. Операции с числами с плавающей точкой могут приводить к потерям. Вы можете использовать BigDecimal
BigDecimal sum = new BigDecimal(0);
while (thereIsNumbers()) { BigDecimal number = new BigDecimal(getNextNumberAsStringFromExcel()); sum = sum.add(number); }
System.out.println(sum);
При создании BigDecimal важно передавать в конструктор именно строку. Если вы передадите туда представление вашей строки уже в виде double, то могут быть погрешности.
Немного про погрешности: https://habrahabr.ru/post/219595/

Комментариев нет:

Отправить комментарий