Лучшая практика представления денег в python без потери ценности

Я хочу разделить данную сумму в долларах на 3 части в зависимости от веса, показанного ниже.

amount = 2220
multiply = [0.6217, 0.1621, 0.2162] # sums up to 1

part_a = amount * multiply[0] # 1380.174
part_b = amount * multiply[1] # 479.964
part_c = amount * multiply[2] # 359.86199999999997

total = part_a + part_b + part_c
print(total) # 2220.0

Сумма part_a, part_b, part_c в сумме дает 2220. Однако проблема возникает, когда я пытаюсь округлить ее до 2 знаков после запятой.

part_a = round(amount * multiply[0], 2) # 1380.17
part_b = round(amount * multiply[1], 2) # 479.96
part_c = round(amount * multiply[2], 2) # 359.86

total = part_a + part_b + part_c
print(total) # 2219.9900000000002

Почему отдельные значения для part_a, part_b, part_c имеют 2 десятичных знака, а общее значение становится 2219.9900000000002?

Как лучше всего рассчитать результаты, чтобы части a, b и c были с двумя знаками после запятой, а сумма различных частей давала исходную сумму, равную 2200?


person Edwin    schedule 17.03.2020    source источник
comment
docs.python.org/3/library/decimal.html   -  person Charles Duffy    schedule 17.03.2020


Ответы (1)


Арифметика с плавающей запятой — проблема для всех языков программирования.

Я видел, как большинство людей умножают числа на 100, чтобы десятичные значения были целыми. Затем округляйте до ближайшего целого числа при выполнении вычислений. Прежде чем они будут представлены пользователю (или когда это необходимо), преобразуйте их обратно в десятичные числа с точностью до 2 цифр.

person Stuart    schedule 17.03.2020