Em JavaScript, ao converter de um float para uma string, como posso obter apenas 2 dígitos após o ponto decimal? Por exemplo, 0,34 em vez de 0,3445434.
427
Em JavaScript, ao converter de um float para uma string, como posso obter apenas 2 dígitos após o ponto decimal? Por exemplo, 0,34 em vez de 0,3445434.
Respostas:
Os detalhes , caso o código não seja auto-explicativo.
edit: ... ou apenas use
toFixed
, como proposto por Tim Büthe . Esqueci esse, obrigado (e um voto positivo) pelo lembrete :)fonte
toFixed()
vai imitar o que algo comoprintf()
faz em C. No entanto,toFixed()
eMath.round()
irá lidar com arredondamento diferente. Nesse caso,toFixed()
terá o mesmo tipo de efeitoMath.floor()
que teria (desde que você multiplique o original por 10 ^ n antes e liguetoFixed()
com n dígitos). A "correção" da resposta depende muito do que o OP deseja aqui, e ambas são "corretas" à sua maneira.Existem funções para arredondar números. Por exemplo:
imprimirá 5.04.
EDIT: Fiddle
fonte
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
será igual"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
…Tenha cuidado ao usar
toFixed()
:Primeiro, o arredondamento do número é feito usando a representação binária do número, o que pode levar a um comportamento inesperado. Por exemplo
em vez de
'0.6'
.Segundo, há um bug do IE
toFixed()
. No IE (pelo menos até a versão 7, não verificou o IE8), o seguinte é verdadeiro:Pode ser uma boa ideia seguir a sugestão de kkyy ou usar uma
toFixed()
função personalizada , por exemplofonte
.toFixed()
método nativo no valor de retorno, que adicionará a quantidade necessária de precisão, por exemplo::return (Math.round(value * power) / power).toFixed(precision);
e também retornará o valor como uma string. Caso contrário, precisão de 20 é ignorado para decimais menorestoFixed
: observe que aumentar a precisão pode gerar resultados inesperados:,(1.2).toFixed(16) === "1.2000000000000000"
enquanto(1.2).toFixed(17) === "1.19999999999999996"
(no Firefox / Chrome; no IE8, o último não é válido devido à menor precisão que o IE8 pode oferecer internamente).(0.598).toFixed(2)
não produz0.6
. Produz0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Outro problema a ter em atenção é que
toFixed()
pode produzir zeros desnecessários no final do número. Por exemplo:A idéia é limpar a saída usando um
RegExp
:O
RegExp
coincide com os zeros à direita (e, opcionalmente, o ponto decimal) para ter certeza que parece ser bom para inteiros também.fonte
fonte
Há um problema com todas essas soluções flutuando usando multiplicadores. Infelizmente, as soluções de kkyy e Christoph estão erradas.
Teste o seu código para o número 551.175 com 2 casas decimais - ele será arredondado para 551,17 enquanto deve ser 551,18 ! Mas se você testar para ex. 451.175, tudo bem - 451.18. Portanto, é difícil identificar esse erro à primeira vista.
O problema está na multiplicação: tente 551.175 * 100 = 55117.49999999999 (ups!)
Então, minha ideia é tratá-lo com toFixed () antes de usar Math.round ();
fonte
toFixed
é afetado -(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
... Qualquer que seja o método usado, adicione um épsilon antes do arredondamento.A chave aqui eu acho que é arredondar corretamente primeiro, então você pode convertê-lo em String.
Agora você pode formatar esse valor com segurança com toFixed (p). Então, com o seu caso específico:
fonte
Se você quiser a string sem arredondar, poderá usar este RegEx (talvez não seja a maneira mais eficiente ... mas é realmente fácil)
fonte
fonte
return float_part ? int_part+'.'+float_part : int_part;
caso contrário, se você passou Integer, ele retornou número com um ponto no final (exemplo de entrada:2100
, saída:2100.
)Talvez você também queira separador decimal? Aqui está uma função que acabei de criar:
fonte
Não há como evitar arredondamentos inconsistentes para preços com x.xx5 como valor real usando multiplicação ou divisão. Se você precisar calcular preços corretos no lado do cliente, mantenha todos os valores em centavos. Isso se deve à natureza da representação interna dos valores numéricos em JavaScript. Observe que o Excel sofre dos mesmos problemas para que a maioria das pessoas não notasse os pequenos erros causados por esse fenômeno. No entanto, os erros podem se acumular sempre que você acrescenta muitos valores calculados. Existe uma teoria completa envolvendo a ordem dos cálculos e outros métodos para minimizar o erro no resultado final. Para enfatizar os problemas com valores decimais, observe que 0,1 + 0,2 não é exatamente igual a 0,3 no JavaScript, enquanto 1 + 2 é igual a 3.
fonte
fonte
Eu uso esse código para formatar carros alegóricos. É baseado,
toPrecision()
mas remove zeros desnecessários. Gostaria de receber sugestões de como simplificar a regex.Exemplo de uso:
fonte