Porque Python usa números de ponto flutuante de precisão dupla para armazenar decimais. No padrão IEEE 754 (52M / 11E / 1S) usado pelo Python, o espaço de armazenamento de 8 bytes de 64 bits é alocado 52 bits para armazenar os dígitos significativos do número de ponto flutuante, 11 bits para armazenar o expoente e 1 bit para armazenar o sinal, que é uma versão binária do formato de notação científica. Embora 52 dígitos significativos pareçam muito, o problema é que os decimais binários tendem a loops infinitos quando representam números racionais. Muitos deles são limitados em decimais decimais, como 1/10 de decimal, que pode ser simplesmente escrito como 0,1 em decimal, mas em binário, deve ser escrito como: 0,000110011001100110011001100110011001100110011001100110011001 ... (todos os seguintes são 1001 ciclos) . Como os números de ponto flutuante têm apenas 52 dígitos significativos, eles são arredondados a partir do 53º dígito. Isso causou o problema de "perda de precisão de ponto flutuante" mencionado no título. A regra de arredondamento é "0 arredondamento 1", então às vezes é um pouco maior e às vezes um pouco menor.
Por exemplo:
print(350*1.4)
O resultado é: 489.99999999999994
Melhorias de código:
import decimal
a = decimal.Decimal('350')
b = decimal.Decimal('1.4')
c = a * b
print(c)
O resultado é: 490,0