Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Qual a melhor pratica para trabalhar com números float e não perder dinheiro?

Eu criei um sistema que pega o valor do banco de dados e envia para um sistema de boletos na nuvem que precisa do valor em centavos. Fiz 2000 boletos em 1 dia, levei 1 semana pra ser avisado do erro. Eu até encontrei algumas soluções já mas o que eu não sei e devia saber? Como não cometer esse erro?

#Código que foi pra produção
#boleto["valor_cobrado"]  = "72,1"
valor = str(int(float(boleto["valor_cobrado"].replace(',', '.'))*100))
# valor = '7209'
# valor expectativa = '7210'

Solução adotada usar round()

>>>72.1 * 100
7209.999999999999
>>> 72.1 * 10 * 10
7210.0
>>> round(72.1 * 100)
7210
2 respostas

Vi que no js ocorre exatamente a mesma coisa.

0.1+0.1+0.1-0.3 = 5.551115123125783e-17
solução!

Olá José,

O melhor mesmo é trabalhar com centavos sempre que possível, e assim usar apenas int no lugar de float.

Exemplos de conversão:

# Melhor maneira é utilizando o round()
valor = int(round(float(boleto["valor_cobrado"].replace(',', '.'))*100))

# Segunda opção
boleto = '72,2'
valor = int(("%.2f" % float(boleto.replace(',', '.'))).replace('.', ''))

# Terceira opção
# Caso o formato seja sempre com vírgula
# Não funciona para 72 por exemplo, mas funciona para 70,1  72,0  72,10  72,01  72, etc...
boleto = '72,1'
valor_boleto = boleto.split(',')
valor = valor_boleto[0] + valor_boleto[1].ljust(2, '0')
valor = int(valor)