Если у меня есть массив двойников, каждый из которых имеет ТОЧНО два десятичных знака, добавьте их полностью через цикл и распечатайте общее количество, то, что выходит, - это число с БОЛЕЕ двумя десятичными знаками. Что странно, потому что теоретически добавление двух чисел, каждое из которых имеет 2 и только 2 десятичных разряда, НИКОГДА не приведет к числу, которое имеет ненулевую цифру за пределами сотых мест.
Попробуйте выполнить этот код:
double[] d = new double[2000];
for (int i = 0; i < d.length; i++) {
d[i] = 9.99;
}
double total = 0,00;
for (int i = 0; i < d.length; i++) {
total += d[i];
if (("" + total).matches("[0-9]+\\.[0-9]{3,}")) { // if there are 3 or more decimal places in the total
System.out.println("total: " + total + ", " + i); // print the total and the iteration when it occured
}
}
На моем компьютере это печатает:
total: 59.940000000000005, 5
Если я округлю итог до двух знаков после запятой, тогда я бы получил тот же номер, что и я, если бы вручную добавил 9.99 шесть раз в калькулятор. Но как это происходит, и откуда появляются дополнительные десятичные знаки? Я делаю что-то неправильно или (я сомневаюсь, что это вероятно), это ошибка Java?