Не надо ссылаться на кого-то, достаточно доказать математически и проверить практически.
Во-первых, точности double (53 бита мантисы) хватит на 17 полных десятичных знаков. С копейками, выходит 15 целых и 2 копеечных. Сомневаюсь, что вы такими суммами оперируете, т.ч. даже с погрешностями перевода 2<->10 вам хватит.
Во-вторых, как я уже писал, после вычислений нужно округлить. Биллинговые системы тоже считают на FPU, только особо упоротые будут BCD или целые вычисления делать.
Где это может подвести? При суммировании очень большого количества double без округления возможно накопление достаточной ошибки, чтобы она проявилась в младшем разряде. Предположим, числа используются от 0.00 до 10000000.00, для их хранения достаточно 30 двоичных разрядов, чтобы оставшиеся 23 разряда мантисы double накопили ошибку на 1 копейку, нужно более 8 млн чисел сложить. Отсюда: либо не суммируем по столько, либо округляем после вычисления формулы, как это делают биллинговые системы.
Демонстрация получения ошибки:
perl -wE 'my $f = 0.0; for (1 .. 250) { for (1 .. 1_000_000) { $f += 0.01 } printf("$_ %.2f %.18f\n", $f, $f) }'
240 млн раз добавил по копейке и ошибка еще в переделах погрешности, на 241-м миллионе сбой.
А теперь добавим округление на каждое миллионное суммирование:
perl -wE 'my $f = 0.0; for (1 .. 100_000) { for (1 .. 1_000_000) { $f += 0.01 } printf("$_ %.2f %.18f\n", $f, $f); $f = int($f * 100 + 0.5) / 100 }'
3.355 млрд суммирований без сбоя.
Для гарантии надо округлять после вычисления формулы.
Если производится суммирование очень большого количества чисел, то после каждого суммирования. Для оптимизации можно округлять, скажем, каждые 1000 суммирований. Для проверки, последний однострочник поменяем и внутренний цикл ограничим 100к. Без сбоев пройдет 214.7483 млрд суммирований!