Estou faltando alguma coisa aqui?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
Por que.toFixed()
retornar uma string?
Quero arredondar o número para 2 dígitos decimais.
javascript
types
rounding
Derek Adair
fonte
fonte
Respostas:
Ele retorna uma string porque 0,1 e suas potências (que são usadas para exibir frações decimais) não são representáveis (pelo menos não com precisão total) em sistemas binários de ponto flutuante.
Por exemplo, 0.1 é realmente 0.1000000000000000055511151231257827021181583404541015625 e 0.01 é realmente 0.01000000000000000020816681711721685132943093776702880859375. (Obrigado
BigDecimal
por provar meu ponto. :-P)Portanto (sem um ponto flutuante decimal ou um tipo de número racional), a saída como uma sequência é a única maneira de ajustá-lo exatamente à precisão necessária para a exibição.
fonte
toFixed
é uma função de formatação, que tem o único objetivo de converter um número em uma sequência de caracteres, formatando-o usando o número especificado de casas decimais. O motivo pelo qual ele retorna uma sequência é porque ela deve retornar uma sequência e, se fosse nomeadatoStringFixed
, o OP não ficaria surpreso com os resultados. O único problema aqui é que o OP esperava que funcionasse comoMath.round
, sem consultar a referência JS.Number.prototype.toFixed
é uma função projetada para formatar um número antes de imprimi-lo. É da família detoString
,toExponential
etoPrecision
.Para arredondar um número, você faria o seguinte:
.
Ou, se você deseja uma função " nativa ", pode estender o protótipo:
No entanto , lembre-se de que poluir o protótipo é considerado ruim quando você está escrevendo um módulo, pois os módulos não devem ter efeitos colaterais. Portanto, para um módulo, use a primeira função .
fonte
type Number
. A coisa é que+(anyValue)
sempre retorna um número - por exemplo.+("45")
retorna45
,+(new Number(42))
retorna42
. É como digitar com força a função. Se você fizer disso um hábito, você pode evitar um monte de erros :)someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
não é42.01
, é~42.0099999999999980
. Motivo: o número42.01
não existe e é arredondado para o número existente mais próximo. entre, números de prova portoPrecision(18)
para imprimi-lo com todos os dígitos relevantes.Eu resolvi esse problema alterando isso:
...para isso:
No entanto, isso converterá o número em uma sequência e o analisará novamente, o que terá um impacto significativo no desempenho. Se você se preocupa com desempenho ou segurança de tipo, verifique as outras respostas também.
fonte
someNumber = Math.round(someNumber * 1e2) / 1e2
! Veja minha resposta para uma maneira mais generalizada.Por que não usar
parseFloat
?fonte
Eu o resolvi convertendo-o de volta para o número usando a
Number()
função JavaScriptfonte
Claro que retorna uma string. Se você quiser arredondar a variável numérica, use Math.round (). O ponto de toFixed é formatar o número com um número fixo de casas decimais para exibição no usuário .
fonte
Você pode simplesmente usar um '+' para converter o resultado em um número.
fonte
O que você esperaria que retornasse quando deveria formatar um número? Se você tem um número, não pode fazer nada com ele porque, por exemplo,
2 == 2.0 == 2.00
etc., por isso deve ser uma string.fonte
Para fornecer um exemplo de por que tem que ser uma string:
Se você formatar 1.toFixed (2), receberá '1.00'.
Não é o mesmo que 1, pois 1 não possui 2 casas decimais.
Sei que o JavaScript não é exatamente uma linguagem de desempenho , mas é provável que você obtenha melhor desempenho para um arredondamento se usar algo como: roundedValue = Math.round (valor * 100) * 0.01
fonte
Porque seu uso principal é exibir números? Se você quiser arredondar números, use
Math.round()
com fatores apropriados.fonte
'42'
é um número ... o que não é. Só porque uma string contém apenas dígitos não a torna um número. Isto não é PHP. :-PAqui está uma versão um pouco mais funcional da resposta
m93a
fornecida.fonte