Я пытаюсь решить следующую реальную проблему, с которой вы могли столкнуться сами:
Вы ужинали с друзьями и согласились разделить счет поровну. За исключением того, что когда, наконец, приходит счет, вы обнаруживаете, что не у всех достаточно денег (если есть, то дешевые ублюдки).
Итак, некоторые из вас платят больше, чем другие ... Потом вы приходите домой и пытаетесь решить, «кто кому и какую сумму должен?».
Я пытаюсь решить эту проблему алгоритмически и честно :)
Сначала это кажется таким простым, но я застреваю с округлением, а что нет, я чувствую себя полным неудачником;)
Есть идеи, как с этим справиться?
РЕДАКТИРОВАТЬ: какой-то код Python, чтобы показать мою путаницу
>>> amounts_paid = [100, 25, 30]
>>> total = sum(amounts_paid)
>>> correct_amount = total / float(len(amounts_paid))
>>> correct_amount
51.666666666666664
>>> diffs = [amnt-correct_amount for amnt in amounts_paid]
>>> diffs
[48.333333333333336, -26.666666666666664, -21.666666666666664]
>>> sum(diffs)
7.1054273576010019e-015
Теоретически сумма разностей должна быть равна нулю, верно?
для другого примера это работает :)
>>> amounts_paid = [100, 50, 150]
>>> total = sum(amounts_paid)
>>> correct_amount = total / float(len(amounts_paid))
>>> correct_amount
100.0
>>> diffs = [amnt-correct_amount for amnt in amounts_paid]
>>> diffs
[0.0, -50.0, 50.0]
>>> sum(diffs)
0.0
float
. Никогда. - person S.Lott   schedule 13.10.2010float
округление не является частью алгоритма. Ваша ошибка 10 ** - 15. Вам придется разделить миллиарды приемов пищи, чтобы даже накопить ошибку 0,01 доллара. Начать сейчас. За несколько столетий, когда вы накопили ошибку в 0,01 доллара, вам есть о чем поговорить. А пока перестаньте кодировать и начните думать. - person S.Lott   schedule 13.10.2010