Какая точность должна быть, чтобы избежать погрешности при пересчёте?

Всем привет.

Есть задача.
Есть полная сумма - Sum.
Sum = amount[0] + amount[1] + ... + amount[n]
Все данные amount[i] (точность до двух знаков), перевели в проценты:
percent[i] = amount[i] * 100 / Sum.

Получаю список данных, в которых хранятся эти проценты, с точностью до двух знаков: 5.26, 5.26 и т.п.
На основе этих данных вычисляется кол-во для каждого процента (т.е. обратный пересчёт):
amount[i] = (Sum * percent[i]) / 100

Какая точность должна быть в процентных данных, чтобы получать корректные количественные данные (при обратном пересчёте), с округлением до двух знаков?
Мне кажется должна быть какая-нить теоремка или док-во по этому поводу.

Заранее благодарен.
  • Вопрос задан
  • 344 просмотра
Пригласить эксперта
Ответы на вопрос 6
О какой точности речь, если везде точность указана и так?
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Если речь про деньги/суммы - точность до 4-х знаков с математическим округлением: 5-й знак (после запятой): 0-4 => вниз, 5-9 => вверх:
(примеры: 0.12342378463 => 0.1234; 0.123498734638 => 0.1235)
Если речь идёт про количество, то тут явно отсутствует параметр price[i].
Проще считать имея цену и кол-во каждой позиции.
Ответ написан
Foolleren
@Foolleren
Компас есть, копать не люблю...
в делфи для работы с деньгами есть специальный тип Currency имеет 4 знака после запятой с обычным округлением
Ответ написан
Комментировать
@evgeniy_lm
Точность значения должна быть максимально возможной (8 знаков для Double). Сколько из этих знаков увидит пользователь это уже другая история
Ответ написан
Комментировать
@Sumor
Ну для начала если у вас слагаемые amount имеют точность 0,01, то сумма (в предельном случае) будет иметь точность до 0,01*N, где N - количество слагаемых. У нас конечно есть центральная предельная теорема, которая говорит, что в среднем худшего случая не будет и матожидание суммы будет сумма слагаемых, но всё равно точность суммы будет хуже (больше), чем 0,01.

Производя операцию
percent[i] = amount[i] * 100 / Sum
amount[i] имеет точность 0,01, Sum - 0,01*N
Считаем точность вычислений percent: она получается от 0,01*100/(Sum + 0,01*N) до 0,01*100/(Sum - 0,01*N)
Если пренебречь точностью Sum, и сумма у вас меньше 100, то погрешность будет точно больше 0,01 - отсюда несовпадение обратных преобразований.

Методика тут указана примерная, насколько я помню математическое образование :)
Точность в данном случае немного неверный термин. Ищите по словосочетанию "расчёт погрешности"
Ответ написан
@zuzuzu
Профессиональный бездельник
а эмпирически не можешь? Ну, на два-три разряда повышать точность для %. И быстро должен прийти к тому, что ищешь.
Так бы ты уже использовал 3 знака после запятой и всё было бы гуд.
Вообще я наблюдаю связь между количеством разрядов слева в "большом" числе и количеством требуемых разрядов в % для восстановления искомого числа. Связь прямая - разрядов у процентов должно быть столько, сколько у тебя разрядов будет у числа "большого".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы