Во-первых, раз округления до второй цифры после запятой, умножте во время вычисления все суммы на 100 и считайте все копейках. Тогда округления будут до целых чисел - так проще.
Во-вторых, чтобы лучше смотрелось с начала примените процентную скидку ко всем ценам, округляя вверх.
Т.е. в вашем примере скидка должна быть 86.1/1086.1. В позиции1 цена будет 9800*(1-86.1/1086.1) = 9023.11 ~ 9024.
Для этого можно сделать
item.price = item.price - floor(item.price * discount / total )
После всех таких операций вам останется вычесть из чека число копеек, не превышающее суммарное количество всех позиций. Сколько их надо вычесть найти легко - подсчитайте сумму чека с новыми ценами и вычтете из нее, сколько должно быть в конце (100000 в вашем примере).
Дальше можно брать позиции в каком-то порядке и убавлять их цену на 1 копейку. Если чек удешивился недостаточно - то продолжаем цикл. Если удешевили больше чем надо, то текущую позицию разбиваем на 2 позиции: одну с ценой на 1 копейку меньше, но с количеством, сколько осталось скинуть, вторую с изначальной ценой и остаточным количеством. Если чек удешевился как раз, то выходим из цикла. Это работает даже если количества дробные.
Что-то вроде:
leftover = ... # сколько осталось скинуть с чека
foreach item in items:
if leftover == 0: break
if item.count > leftover:
new_item = item
new_item.count = item.count - leftover
item.count = leftover
item.price -= 1
items.add(new_item)
break
else:
item.price -= 1
leftover -= item.count
Есть, правда, один крайний случай. Что делать, если все товары стоят по 0.01 изначально? Можно ли скидывать товар до 0? Если можно, то этот алгоритм работает. Если нет, то такой чек вообще никак нельзя урезать.