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

277
26 декабря 2017, 17:03

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

READ ALSO
Фатальная ошибка libgdx

Фатальная ошибка libgdx

Во время выполнения кода:

239
Можно ли с помощью shell открыть закладку chrome apk?

Можно ли с помощью shell открыть закладку chrome apk?

Есть ли быстрый способ запустить командно одну из закладок Google Chrome?

306
Кодировка в запросах из Java

Кодировка в запросах из Java

Есть Tomcat 8 + сервлеты, IDE - Eclipse, ОС - Debian 9Из сервлетов посылаю GET-запрос на удаленный сервер (указав кодировку в запросе

386