Страницы

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

понедельник, 6 января 2020 г.

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

#java


Столбец 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();
            }
        }

    


Ответы

Ответ 1



Да, вполне. Операции с числами с плавающей точкой могут приводить к потерям. Вы можете использовать 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/

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

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