Eu tenho essa linha de código que arredonda meus números para duas casas decimais. Mas recebo números como este: 10.8, 2.4, etc. Não é minha idéia de duas casas decimais; portanto, como posso melhorar o seguinte?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
Quero números como 10.80, 2.40, etc. O uso do jQuery é bom para mim.
javascript
rounding
decimal-point
Abdômen
fonte
fonte
0.565
,0.575
,1.005
), eu posso sugerir olhando de novo para esta resposta , que recebe-los corrigir?number.toFixed(x)
método para convertê-lo em uma sequência com a quantidade necessária de zeros. Por exemplo, arredonde1.34
para1.3
com o método entre navegadores e adicione 1 zero e converta em string com1.3.toFixed(2)
(para obter"1.30"
).Respostas:
Para formatar um número usando a notação de ponto fixo, você pode simplesmente usar o método toFixed :
Observe que
toFixed()
retorna uma string.IMPORTANTE : Observe que toFixed não arredonda 90% das vezes, ele retornará o valor arredondado, mas, em muitos casos, não funciona.
Por exemplo:
2.005.toFixed(2) === "2.00"
ATUALIZAR:
Atualmente, você pode usar o
Intl.NumberFormat
construtor. Faz parte da Especificação da API de internacionalização do ECMAScript (ECMA402). Ele tem suporte muito bom navegador , incluindo até mesmo IE11, e é totalmente suportado no Node.js .Como alternativa, você pode usar o
toLocaleString
método, que internamente usará aIntl
API:Essa API também oferece uma ampla variedade de opções para formatar, como milhares de separadores, símbolos de moeda, etc.
fonte
(0.09).toFixed(1);
dá 0,0 no IE8Math.Round(0.09)
retornará0
para que isso irá sempre dar0.0
...Math.round(value*100)/100
funciona melhor para 2DP.Este é um tópico antigo, mas ainda assim obtém os melhores resultados do Google e as soluções oferecidas compartilham o mesmo problema de decimais de ponto flutuante. Aqui está a função (muito genérica) que eu uso, graças ao MDN :
Como podemos ver, não temos esses problemas:
Essa genicidade também fornece algumas coisas legais:
Agora, para responder à pergunta do OP, é preciso digitar:
Ou, para uma função mais concisa e menos genérica:
Você pode chamá-lo com:
Vários exemplos e testes (graças a @ tj-crowder !):
Mostrar snippet de código
fonte
Normalmente, eu adiciono isso à minha biblioteca pessoal e, depois de algumas sugestões e usando a solução @TIMINeutron também, e tornando-a adaptável para o tamanho decimal, este se encaixa melhor:
funcionará para as exceções relatadas.
fonte
Não sei por que não consigo adicionar um comentário a uma resposta anterior (talvez eu esteja irremediavelmente cego, não sei), mas eu vim com uma solução usando a resposta de @ Miguel:
E seus dois comentários (de @bighostkim e @Imre):
precise_round(1.275,2)
não retornar 1,28precise_round(6,2)
não retornar 6,00 (como ele queria).Minha solução final é a seguinte:
Como você pode ver, eu tive que adicionar um pouco de "correção" (não é o que é, mas como o Math.round está com perdas - você pode conferir no jsfiddle.net - esta é a única maneira que eu sabia "corrigir " isto). Ele adiciona 0,001 ao número já preenchido, adicionando
1
três0
s à direita do valor decimal. Portanto, deve ser seguro usar.Depois disso, adicionei
.toFixed(decimal)
para sempre imprimir o número no formato correto (com a quantidade correta de decimais).Então é isso mesmo. Use bem ;)
EDIT: funcionalidade adicionada à "correção" de números negativos.
fonte
precise_round(1.27499,2)
agora também retorna 1,28 ... NãoMath.round
é com perdas; da maneira que os computadores armazenam internamente valores de ponto flutuante. Basicamente, você está condenado a falhar com alguns valores antes que os dados fica ainda à sua função :)Uma maneira de ter 100% de certeza de obter um número com 2 casas decimais:
Se isso causar erros de arredondamento, você pode usar o seguinte, como James explicou em seu comentário:
fonte
var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Use este método abaixo
E se você quiser que o número seja corrigido, use
fonte
Não encontrei uma solução precisa para esse problema, então criei a minha:
Exemplos:
fonte
O @heridev e eu criamos uma pequena função no jQuery.
Você pode tentar a seguir:
HTML
jQuery
DEMO ONLINE:
http://jsfiddle.net/c4Wqn/
fonte
input
evento. Isso não cria um efeito de oscilação e também é acionado quando você acessa o campo com JSO problema com os valores de ponto flutuante é que eles estão tentando representar uma quantidade infinita de valores (contínuos) com uma quantidade fixa de bits. Então, naturalmente, deve haver alguma perda no jogo, e você será mordido com alguns valores.
Quando um computador armazena 1.275 como um valor de ponto flutuante, na verdade não se lembra se era 1.275 ou 1.27499999999999993 ou mesmo 1.27500000000000002. Esses valores devem fornecer resultados diferentes após o arredondamento para duas casas decimais, mas não o serão, pois, para o computador, parecem exatamente os mesmos após o armazenamento como valores de ponto flutuante, e não há como restaurar os dados perdidos. Quaisquer cálculos adicionais acumularão essa imprecisão.
Portanto, se a precisão importa, você deve evitar valores de ponto flutuante desde o início. As opções mais simples são:
Por exemplo, ao usar números inteiros para armazenar o número de centésimos, a função para encontrar o valor real é bastante simples:
Com seqüências de caracteres, você precisará arredondar, mas ainda é gerenciável:
Observe que esta função arredonda para o mais próximo, desvia do zero , enquanto o IEEE 754 recomenda arredondar para o mais próximo, desvia para o mesmo como o comportamento padrão para operações de ponto flutuante. Tais modificações são deixadas como um exercício para o leitor :)
fonte
Aqui está um simples
Use como
alert(roundFloat(1.79209243929,4));
Jsfiddle
fonte
Arredonde seu valor decimal e use
toFixed(x)
para o (s) dígito (s) esperado (s).Ligar
parseDecimalRoundAndFixed (10.800243929,4) => 10.80 parseDecimalRoundAndFixed (10.807243929,2) => 10.81
fonte
Arredondar para baixo
Arredondar para cima
Rodada mais próxima
fonte
fonte
Aqui está minha solução de 1 linha:
Number((yourNumericValueHere).toFixed(2));
Aqui está o que acontece:
1) Primeiro, você aplica
.toFixed(2)
o número ao qual deseja arredondar as casas decimais de. Observe que isso converterá o valor em uma seqüência de caracteres do número. Portanto, se você estiver usando o Typecript, ocorrerá um erro como este:"O tipo 'string' não pode ser atribuído ao tipo 'number'"
2) Para recuperar o valor numérico ou converter a string em valor numérico, basta aplicar a
Number()
função no chamado valor de 'string'.Para esclarecimentos, veja o exemplo abaixo:
EXEMPLO: Eu tenho uma quantidade que tem até 5 dígitos nas casas decimais e gostaria de encurtá-la para até 2 casas decimais. Eu faço assim:
fonte
Coloque o seguinte em algum escopo global:
e tente :
Atualizar
Observe que
toFixed()
só pode funcionar para o número de casas decimais entre0-20
ie,a.getDecimals(25)
pode gerar um erro javascript, portanto, para acomodar que você pode adicionar alguma verificação adicional, ou seja,fonte
isso retornará um número aleatório de 1 a 100 arredondado para 2 casas decimais.
fonte
Isso funcionou para mim: arredondando decimais em JavaScript
fonte
Usando esta resposta por referência: https://stackoverflow.com/a/21029698/454827
Eu construo uma função para obter números dinâmicos de decimais:
aqui exemplo de trabalho: https://jsfiddle.net/wpxLduLc/
fonte
fonte
Com esses exemplos, você ainda receberá um erro ao tentar arredondar o número 1.005, a solução é usar uma biblioteca como Math.js ou esta função:
fonte
Eu recebi algumas idéias deste post alguns meses atrás, mas nenhuma das respostas aqui, nem as respostas de outros posts / blogs poderiam lidar com todos os cenários (por exemplo, números negativos e alguns "números da sorte" encontrados pelo nosso testador). No final, nosso testador não encontrou nenhum problema com este método abaixo. Colar um trecho do meu código:
Também tenho comentários de código (desculpe, já esqueci todos os detalhes) ... Estou postando minha resposta aqui para referência futura:
fonte
Estou resolvendo o problema do modificador. Suporta apenas 2 decimais.
fonte
Isso deve render:
10.20
Isso deve render:
0.05
Isso deve render:
4.04
etc.
fonte
fonte
Isso é muito simples e funciona tão bem quanto qualquer outro:
Como toFixed () só pode ser chamado em números e, infelizmente, retorna uma string, isso faz toda a análise para você nas duas direções. Você pode passar uma string ou um número e sempre recebe um número de volta! Chamar parseNumber (1.49) fornecerá 1 e parseNumber (1.49,2) fornecerá 1,50. Assim como o melhor deles!
fonte
Você também pode usar o
.toPrecision()
método e algum código personalizado e sempre arredondar para o enésimo dígito decimal, independentemente do comprimento da parte int.Você também pode torná-lo um plug-in para um melhor uso.
fonte
Simples assim.
fonte
Eu encontrei uma maneira muito simples que resolveu esse problema para mim e pode ser usada ou adaptada:
fonte
100% trabalhando !!! Tente
fonte