Столбец 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/
Комментариев нет:
Отправить комментарий