Des centimes qui tombent juste
10 € entre trois personnes, c'est 3,333… € chacun. Arrondir chaque part fait disparaître ou apparaître un centime, et les nombres à virgule flottante ajoutent leurs propres erreurs : 0,1 + 0,2 n'y vaut pas 0,3.
Tous les montants sont des entiers en centimes. La répartition suit la méthode du plus fort reste : chacun reçoit la partie entière de sa part, puis les centimes restants vont aux plus grandes parties fractionnaires. Des tests de propriétés vérifient, sur des centaines de cas tirés au hasard, que la somme des parts est toujours exacte.
# Méthode du plus fort reste : la somme des parts est toujours exacte
total = sum(weights.values())
for index, (key, weight) in enumerate(weights.items()):
quotient, remainder = divmod(amount * weight, total)
shares[key] = quotient
remainders.append((-remainder, index, key))
# Les centimes restants vont aux plus grands restes
missing = amount - sum(shares.values())
for _, _, key in sorted(remainders)[:missing]:
shares[key] += 1







