Alert em JavaScript não apresenta números decimais

   <script>
      let conta = prompt("Informe o valor da conta")
      let clientes = prompt("Informe o número de pessoas que irão pagar")
      let valorPorCliente = parseFloat(conta) / Number(clientes).toFixed(2)
      console.log(conta)
      console.log(valorPorCliente)
      alert("O valor que cada pessoa deve pagar é de: R$"+valorPorCliente)
    </script>

Boa tarde, estou tentando fazer um algoritmo em JS que lê o valor de uma conta, o número de pessoas que vai pagar, e diz quanto cada uma terá que pagar.

Só que na hora de mostrar a parte final, os alerts vem sem a parte decimal, ou com o resultado diferente de uma calculadora, por exemplo, fiz um teste assim:

conta - 79,81

pessoas - 4

valor p/ pessoa - 19,75

============

esse era o resultado que o alert retornava, mas até em uma calculadora ciêntifica a resposta era 19.95. Porque isso ocorre?

tente user o parseFloat direto no input e nao dps, ja q dps do valor ser guardado como int, n tem mais oq fzr, ou seja, sempre trate os formatos direto no input, caso queira algo diferente de int

1 curtida

tente isso

alert("O valor que cada pessoa deve pagar é de: R$"+valorPorCliente.toLocaleString('pt-br',{style: 'currency', currency: 'BRL'}))

Aperte F12, na guia console vc pode testar:
image

Simples meu caro: 79,81 é 79, 79/4 = 19.75

A solução é relativamente simples, troque , por .:

parseFloat(conta.replace(',','.'))

Mas aí você vai ter outro problema, toFixed é chamado em Number(clientes) e não no resultado da divisão, essa precisa por a divisão entre parêntesis pra funcionar:

(parseFloat(conta) / Number(clientes)).toFixed(2);

A solução completa:

<script>
      let conta = prompt("Informe o valor da conta")
      let clientes = prompt("Informe o número de pessoas que irão pagar")
      let valorPorCliente = (parseFloat(conta.replace(',','.')) / Number(clientes)).toFixed(2)
      console.log(conta)
      console.log(valorPorCliente)
      alert("O valor que cada pessoa deve pagar é de: R$"+valorPorCliente)
    </script>

Se for no alert, eu já tentei e ficou na mesma.

Pra que serve ?

parseFloat(conta.replace(',','.'))

falei a conta inteira amigo, o resultado da conta inteira tem que ser passado a float, desse jeito

<script>
      let conta = prompt("Informe o valor da conta")
      let clientes = prompt("Informe o número de pessoas que irão pagar")
      let valorPorCliente = parseFloat(conta / Number(clientes).toFixed(2))
      console.log(conta)
      console.log(valorPorCliente)
      alert("O valor que cada pessoa deve pagar é de: R$"+valorPorCliente)
 </script>
1 curtida

Porque tem que ser passado tudo pra float ? Até o Number()

1 curtida

porque o resultado da conta inteira vai ser o decimal, entende? se vc passar somente a “conta”, somente “conta” vai ser um float, logo dps que o calculo for feito ele volta a ser um “int” q 'e o padrao do js

2 curtidas

Suportar tanto 3,14 quanto 3.14

Só esse tem que ser fora dos parentesis se não ele não tem efeito

1 curtida

Tá entendi! Farei a substituição e informo se deu certo.

1 curtida

entendi! com vírgula o programa só entende os 2 primeiros digitos! dai com o outro método funcionou.

1 curtida
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
      let conta = prompt("Informe o valor da conta")
      let clientes = prompt("Informe o número de pessoas que irão pagar")
      let valorPorCliente = parseFloat( conta.replace(",",".") / Number(clientes)).toFixed(2)
      console.log(conta)
      console.log(valorPorCliente)
      alert("O valor que cada pessoa deve pagar é de: R$"+valorPorCliente.replace(".",","))
    </script>
    <title>Document</title>
</head>
<body>
    
</body>
</html>

O código final ficou assim! O método de substituição de vírgula por pontos funciona e acredito que seja o mais correto a se utilizar!

1 curtida

Não é só a substituição da vírgula por ., antes de copiar a resposta é interessante ler o comentário todo, apenas com o replace, o seu código ainda daria a resposta errada, tinha 2 erros um de sanitização (o replace) e um de lógica (onde estava usando o toFixed)

to Fixed é só pra formatar as casas decimais.
E no alert é só fazer outra conversão de . por ,

De fato, mas por favor, leia meu comentário, da forma como fez o resultado daria 19.9595

Você estava chamando o toFixed(2) na quantidade de clientes e não em valorPorCliente

1 curtida

Maninho, eu li, fica tranquilo. Já testei esse código e tá tudo certo nele.
toFixed tá sendo chamado em Valor por Cliente e não no let clientes.
É o valor por cliente que precissa dessa formatação.

Certeza man?

Minha incitência nisso é porque você copiou a solução que funciona sem perceber isso, estar em valorPorCliente é a solução para o seu segundo problema

1 curtida

Veja o comentário marcado como solução.