Pular para o conteúdo
Backend

0.7+0.1 no JS: float e dinheiro em ticket | guia prático

Por que 0.7+0.1 no JavaScript não dá 0.8 limpo: floats priorizam espaço e sacrificam precisão. O que isso muda ao salvar preço de ticket em centavos

Resposta direta

Dinheiro em float é armadilha clássica; o episódio liga o bug visual ao design de preço em centavos. Ticket Price preço do ingresso, cara, qual é a chance de a gente fazer cálculo com isso? Da gente ter que gerar um relatório, da gente ter que somar dois ticket price, da gente ter que subtrair.

O resultado estranho de 0.7 + 0.1

Alguém consegue me explicar por que dá esse resultado aqui? Por padrão, o JavaScript armazena esses números aqui como floats. O floats é um tipo numérico de dado que prioriza a otimização de espaço.

Então, ele aceita sacrificar precisão para ter uma otimização de espaço maior. Então, você precisa tomar muito cuidado ao trabalhar com casas decimais em linguagem de programação. Isso é um problema, turma, oriundo de linguagem de programação.

Então, eu não gosto de salvar números com ponto flutuante. Porque assim, se você tem um número que, cara, você vai salvar como ponto flutuante lá no seu banco. E você não vai fazer cálculos com ele na sua linguagem de programação.

Float: espaço vs precisão

Cara, tudo bem, pode salvar como ponto flutuante. Porque o problema tá quando você tenta fazer cálculo. Agora, se você vai fazer cálculos com isso, por exemplo, turma.

Ticket Price preço do ingresso, cara, qual é a chance de a gente fazer cálculo com isso? Da gente ter que gerar um relatório, da gente ter que somar dois ticket price, da gente ter que subtrair. Então, nesses casos, turma, o ideal é você armazenar inteiro.

Então, você usar um integer e salvar em centavos. Porque aí você não vai ter ponto flutuante. Você concorda que eu salvar 8 reais Ou a sua representação em centavos, 800.

Leitura útil

Dinheiro em float é armadilha clássica; o episódio liga o bug visual ao design de preço em centavos. Use o trecho acima como restrição, não como citação ornamental.

Por que ticket em centavos aparece

Cara, eu só preciso saber onde vai o ponto. Então eu posso salvar como 800 se eu saber que lá na frente o ponto vai aqui, concorda? Ou seja, eu posso salvar em 800 e quando eu for exibir esse cara lá no meu front-end, por exemplo, eu divido por 100.

Alguém consegue me explicar por que dá esse resultado aqui? Por padrão, o JavaScript armazena esses números aqui como floats. O floats é um tipo numérico de dado que prioriza a otimização de espaço. Então, ele aceita sacrificar precisão para ter uma otimização de espaço maior.

Então, você precisa tomar muito cuidado ao trabalhar com casas decimais em linguagem de programação. Isso é um problema, turma, oriundo de linguagem de programação. Então, eu não gosto de salvar números com ponto flutuante. Porque assim, se você tem um número que, cara, você vai salvar como ponto flutuante lá no seu banco.

Como persistir valores monetários

Alguém consegue me explicar por que dá esse resultado aqui? Por padrão, o JavaScript armazena esses números aqui como floats. O floats é um tipo numérico de dado que prioriza a otimização de espaço. Então, ele aceita sacrificar precisão para ter uma otimização de espaço maior.

Então, você precisa tomar muito cuidado ao trabalhar com casas decimais em linguagem de programação. Isso é um problema, turma, oriundo de linguagem de programação. Então, eu não gosto de salvar números com ponto flutuante. Porque assim, se você tem um número que, cara, você vai salvar como ponto flutuante lá no seu banco.

E você não vai fazer cálculos com ele na sua linguagem de programação. Cara, tudo bem, pode salvar como ponto flutuante. Porque o problema tá quando você tenta fazer cálculo. Agora, se você vai fazer cálculos com isso, por exemplo, turma.

Testes que pegam o bug cedo

Alguém consegue me explicar por que dá esse resultado aqui? Por padrão, o JavaScript armazena esses números aqui como floats. O floats é um tipo numérico de dado que prioriza a otimização de espaço. Então, ele aceita sacrificar precisão para ter uma otimização de espaço maior.

Então, você precisa tomar muito cuidado ao trabalhar com casas decimais em linguagem de programação. Isso é um problema, turma, oriundo de linguagem de programação. Então, eu não gosto de salvar números com ponto flutuante. Porque assim, se você tem um número que, cara, você vai salvar como ponto flutuante lá no seu banco.

E você não vai fazer cálculos com ele na sua linguagem de programação. Cara, tudo bem, pode salvar como ponto flutuante. Porque o problema tá quando você tenta fazer cálculo. Agora, se você vai fazer cálculos com isso, por exemplo, turma.

Próximo passo

Escolha uma métrica (tempo, retries, conversão ou qualidade aceita) e rode 7 dias antes de escalar o padrão.

Perguntas frequentes

É bug do JavaScript?

É consequência de IEEE-754, comum em várias linguagens com float binário.

Sempre use centavos inteiros?

É o padrão seguro para moeda; evite float para saldo/preço.

Decimal library resolve?

Ajuda, mas a decisão de modelo (inteiro vs decimal) vem primeiro.

Como demonstrar no time?

Mostre o console 0.7+0.1 e o mesmo valor em inteiros de centavos.

Por que ticket em centavos aparece

Cara, eu só preciso saber onde vai o ponto. Então eu posso salvar como 800 se eu saber que lá na frente o ponto vai aqui, concorda? Ou seja, eu posso salvar em 800 e quando eu for exibir esse cara lá no meu front-end, por exemplo, eu divido por 100. Alguém consegue me explicar por que dá esse resultado aqui? Por padrão, o JavaScript armazena esses números aqui como floats. O floats é um tipo numérico de dado que prioriza a otimização de espaço. Então, ele aceita sacrificar precisão para ter uma otimização de espaço maior. Então, você precisa tomar muito cuidado ao trabalhar com casas decimais em linguagem de programação. Isso é um problema, turma, oriundo de linguagem de programação. Então, eu não gosto de salvar números com ponto flutuante. Porque assim, se você tem um número que, cara, você vai salvar como ponto flutuante lá no seu banco.

Como persistir valores monetários

Alguém consegue me explicar por que dá esse resultado aqui? Por padrão, o JavaScript armazena esses números aqui como floats. O floats é um tipo numérico de dado que prioriza a otimização de espaço. Então, ele aceita sacrificar precisão para ter uma otimização de espaço maior. Então, você precisa tomar muito cuidado ao trabalhar com casas decimais em linguagem de programação. Isso é um problema, turma, oriundo de linguagem de programação. Então, eu não gosto de salvar números com ponto flutuante. Porque assim, se você tem um número que, cara, você vai salvar como ponto flutuante lá no seu banco. E você não vai fazer cálculos com ele na sua linguagem de programação. Cara, tudo bem, pode salvar como ponto flutuante. Porque o problema tá quando você tenta fazer cálculo. Agora, se você vai fazer cálculos com isso, por exemplo, turma.