Suponha que eu tenha um valor de 15.7784514, desejo exibi-lo 15.77 sem arredondamento.
var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));
Resulta em -
15.8
15.78
15.778
15.7784514000
Como eu mostro 15.77?
javascript
tempid
fonte
fonte
Respostas:
Converta o número em uma string, combine o número até a segunda casa decimal:
O
toFixed
método falha em alguns casostoString
, diferentemente , portanto, tenha muito cuidado com ele.fonte
toFixed
, porém, assim:(Math.floor(value * 100) / 100).toFixed(2)
. Como você provavelmente sabe, coisas estranhas de precisão podem acontecer com valores de ponto flutuante (e do outro lado do espectro, se o número for15
, parece que o OP deseja15.00
).Number((15.7784514000*100).toString().match(/^\d+/)/100);
Atualização 5 de novembro de 2016
Nova resposta, sempre precisa
Como a matemática de ponto flutuante em javascript sempre terá casos extremos, a solução anterior será precisa na maior parte do tempo, o que não é bom o suficiente. Existem algumas soluções para isso
num.toPrecision
, como BigDecimal.js e accounting.js . No entanto, acredito que apenas analisar a string será a mais simples e sempre precisa.Baseando a atualização no regex bem escrito da resposta aceita pelo @Gumbo, essa nova função toFixed sempre funcionará conforme o esperado.
Resposta antiga, nem sempre precisa.
Role sua própria função toFixed:
fonte
toFixed(0.0000000052, 2)
produz '5,2'. Isso pode ser corrigido usandoreturn num.toFixed(fixed+1).match(re)[0];
Aviso Estou usando toFixed com uma casa decimal acima da meta para evitar arredondamento, em seguida, executar o seu jogo regexOptei por escrever isso em vez de remover manualmente o restante com strings, para não precisar lidar com os problemas de matemática que acompanham os números:
Isso fornecerá "15,77" com num = 15,7784514;
fonte
Outubro 2017
Solução geral para truncar (sem arredondamento) um número para o n-ésimo dígito decimal e convertê-lo em uma sequência com exatamente n dígitos decimais, para qualquer n≥0.
onde x pode ser um número (que é convertido em uma sequência) ou uma sequência.
Aqui estão alguns testes para n = 2 (incluindo o solicitado pelo OP):
* Conforme mencionado na nota, isso se deve à conversão implícita do javascript em exponencial para "1.99e-7" E para alguns outros valores de n:
fonte
toFixedTrunc(0.000000199, 2) // 1.99
parseInt é mais rápido que Math.floor
fonte
Simples faça isso
fonte
Isso retornará 19,66
fonte
Essas soluções funcionam, mas para mim parecem desnecessariamente complicadas. Pessoalmente, gosto de usar o operador de módulo para obter o restante de uma operação de divisão e removê-lo. Supondo que num = 15.7784514:
Isso é equivalente a dizer num = num - (num% .01).
fonte
As respostas aqui não me ajudaram, continuaram arredondando ou me dando o decimal errado.
minha solução converte seu decimal em uma string, extrai os caracteres e retorna a coisa toda como um número.
fonte
Minha versão para números positivos:
Rápido, bonito, óbvio. (versão para números positivos)
fonte
-0.7752
. Teste que eletoFixed_norounding(-0.7752,2)
retorna em-0.78
vez de-0.77
O código a seguir funciona muito bem para mim:
fonte
-?
;)Corrigi usando as seguintes maneiras simples:
Os resultados serão 15,77
fonte
-15.7784514
retornos-15.78
Apenas trunque os dígitos:
fonte
Outra solução de linha única:
Usei 100 porque você deseja truncar para o segundo dígito, mas uma solução mais flexível seria:
onde dígitos é a quantidade de dígitos decimais a serem mantidos.
Consulte Especificações do Math.trunc para obter detalhes e compatibilidade do navegador.
fonte
Olha Você aqui. Uma resposta que mostra mais uma maneira de resolver o problema:
Observe o uso de + antes da expressão final. Isso é para converter nossa sequência truncada e fatiada de volta ao tipo de número.
Espero que ajude!
fonte
truncar sem zeros
ou
teste:
truncar com zeros
teste:
fonte
Isto funcionou bem para mim. Espero que isso também resolva seus problemas.
fonte
Uma maneira fácil de fazer isso é a próxima, mas é necessário garantir que o parâmetro amount seja fornecido como uma string.
}
fonte
fonte
Eu costumava
(num-0.05).toFixed(1)
colocar o segundo decimal no chão.fonte
Minha solução em texto datilografado (pode ser facilmente portada para JS):
Casos de teste:
Alguma melhoria?
fonte
Role sua própria
toFixed
função: para valores positivosMath.floor
funciona bem.Para valores negativos
Math.floor
é o arredondamento dos valores. Então você pode usarMath.ceil
.Exemplo,
fonte
A segunda solução da Gumbo, com a expressão regular, funciona, mas é lenta por causa da expressão regular. A primeira solução da Gumbo falha em determinadas situações devido à imprecisão no número de pontos flutuantes. Veja o JSFiddle para uma demonstração e uma referência. A segunda solução leva cerca de 1636 nanossegundos por chamada no meu sistema atual, CPU Intel Core i5-2500 a 3,30 GHz.
A solução que eu escrevi envolve adicionar uma pequena compensação para cuidar da imprecisão de ponto flutuante. É basicamente instantâneo, ou seja, da ordem de nanossegundos. Cronometrei 2 nanossegundos por chamada, mas os timers do JavaScript não são muito precisos ou granulares. Aqui está o JS Fiddle e o código.
fonte
Com base na resposta de David D :
fonte
É mais confiável obter dois pontos flutuantes sem arredondar.
Resposta de referência
Obrigado !
fonte
Já existe uma resposta adequada com expressão regular e cálculo aritmético, você também pode tentar isso
fonte
Aqui está o que fez com string
fonte
Todas essas respostas parecem um pouco complicadas. Eu apenas subtrairia 0,5 do seu número e usaria toFixed ().
fonte
A solução mais eficiente (para dois dígitos da fração) é subtrair 0,005 antes de chamar
toFixed()
Os números negativos também serão arredondados para baixo (longe de zero). O OP não falou nada sobre números negativos.
fonte
Sei que já existem poucos exemplos de trabalho, mas acho que vale a pena propor meu equivalente String.toFixed, alguns podem achar útil.
Essa é a minha alternativa toFixed, que não arredonda números, apenas o trunca ou adiciona zeros de acordo com a precisão fornecida. Para um número extra longo, ele usa o arredondamento JS embutido quando a precisão é longa. A função funciona para todos os números problemáticos que encontrei na pilha.
Lembre-se de que a precisão pode não ser tratada adequadamente para números de comprimento 18 e superior; por exemplo, o Chrome de 64 bits o arredondará ou adicionará "e +" / "e-" para manter o comprimento do número em 18.
Se você deseja executar operações em números reais, é mais seguro multiplicá-lo por
Math.sqrt(10, precision)
primeiro, faça os cálculos e depois mergulhe o resultado pelo valor do multiplicador.Exemplo:
É por isso que é tão importante usar esse multiplicador / divisor ao lidar com números reais em javascript, especialmente quando você está calculando dinheiro ...
fonte