Diferença entre toFixed () e toPrecision ()?


124

Eu sou novo em JavaScript e acabei de descobrir toFixed()e toPrecision()arredondar números. No entanto, não consigo descobrir qual é a diferença entre os dois.

Qual é a diferença entre number.toFixed()e number.toPrecision()?

Respostas:


133

toFixed(n)fornece ncomprimento após o ponto decimal; toPrecision(x)fornece xcomprimento total.

Ref na w3schools: toFixed e toPrecision

EDIT :
Aprendi há algum tempo que o w3schools não é exatamente a melhor fonte, mas esqueci essa resposta até ver o comentário "entusiasmado" de kzh. Aqui estão outras referências do Mozilla Doc Center paratoFixed() e paratoPrecision() . Felizmente para todos nós, o MDC e o w3schools concordam nesse caso.

Para completar, devo mencionar que toFixed()é equivalente a toFixed(0)e toPrecision()apenas retorna o número original sem formatação.


11
Bah, publiquei isso em julho de 2010 e não aprendi sobre o w3fools até este ano. Enquanto os tolos estão certos sobre algumas coisas, nem tudo nas escolas está errado. Obrigado por apontar que eu preciso atualizar este post; vai fazer isso daqui a pouco.
Pops)

24
toPrecision(x)não "fornece xcomprimento total", formata para um número de dígitos significativos. Por exemplo, 0.0000022.toPrecision(1)retornaria 0.000002.
Andy E

5
Acabei de visitar o w3fools e não fiquei convencido. Eu nem vejo nenhum argumento. Tudo o que vejo é um anúncio publicitário para outros dois sites.
NiCk Newman 8/03/16

2
A declaração "... toPrecision(x)fornece xcomprimento total". não é necessariamente válido. Exemplo de contador:0.00001234.toPrecision(3)
djvg 28/11

59

Acredito que o primeiro fornece um número fixo de casas decimais, enquanto o último fornece um número fixo de dígitos significativos.

Math.PI.toFixed(2); // "3.14"
Math.PI.toPrecision(2); // "3.1"

Além disso, toPrecisionproduzirá notação científica se houver mais dígitos inteiros no número do que a precisão especificada.

(Math.PI * 10).toPrecision(2); // "31"
(Math.PI * 100).toPrecision(2); // "3.1e+2"

EDIT: Ah, e se você é novo no JavaScript, recomendo o livro " JavaScript: The Good Parts ", de Douglas Crockford.


14

Os exemplos falam claramente:

var A = 123.456789;

A.toFixed()      // 123
A.toFixed(0)     // 123
A.toFixed(1)     // 123.5
A.toFixed(2)     // 123.46
A.toFixed(3)     // 123.457
A.toFixed(4)     // 123.4568
A.toFixed(5)     // 123.45679
A.toFixed(6)     // 123.456789
A.toFixed(7)     // 123.4567890
A.toFixed(8)     // 123.45678900
A.toFixed(9)     // 123.456789000
A.toFixed(10)    // 123.4567890000
A.toFixed(11)    // 123.45678900000

A.toPrecision()      // 123.456789 
A.toPrecision(0)     // --- ERROR --- 
A.toPrecision(1)     // 1e+2
A.toPrecision(2)     // 1.2e+2
A.toPrecision(3)     // 123
A.toPrecision(4)     // 123.5
A.toPrecision(5)     // 123.46
A.toPrecision(6)     // 123.457
A.toPrecision(7)     // 123.4568
A.toPrecision(8)     // 123.45679
A.toPrecision(9)     // 123.456789
A.toPrecision(10)    // 123.4567890
A.toPrecision(11)    // 123.45678900

11

Eu acho que isso é melhor respondido com um exemplo.

Digamos que você tenha os seguintes dados:

var products = [
  {
    "title": "Really Nice Pen",
    "price": 150
  },
  {
    "title": "Golf Shirt",
    "price": 49.99
  },
  {
    "title": "My Car",
    "price": 1234.56
  }
]

Você deseja exibir cada um desses produtos com o título e o preço formatado. Vamos tentar usar toPrecisionprimeiro:

document.write("The price of " + products[0].title + " is $" + products[0].price.toPrecision(5));

The price of Really Nice Pen is $150.00

Parece bom, então você pode pensar que isso funcionará também para os outros produtos:

document.write("The price of " + products[1].title + " is $" + products[2].price.toPrecision(5));
document.write("The price of " + products[2].title + " is $" + products[2].price.toPrecision(5));

The price of Golf Shirt is $49.990
The price of My Car is $1234.6

Não tão bom. Podemos corrigir isso alterando o número de dígitos significativos para cada produto, mas se estivermos repetindo a variedade de produtos, isso pode ser complicado. Vamos usar toFixed:

document.write("The price of " + products[0].title + " is $" + products[0].price.toFixed(2));
document.write("The price of " + products[1].title + " is $" + products[2].price.toFixed(2));
document.write("The price of " + products[2].title + " is $" + products[2].price.toFixed(2));

The price of Really Nice Pen is $150.00
The price of Golf Shirt is $49.99
The price of My Car is $1234.56

Isso produz o que você esperava. Não há trabalho de adivinhação envolvido e não há arredondamento.



5

Sob certas circunstâncias, toPrecision()retornará notação exponencial, enquanto toFixed()não retornará .


Na verdade, toExponential()é uma função separada .
Pops

4
@ Lord Torgamus: De acordo com minha cópia do Javascript: The Definitive Guide , toPrecision (precision) usará notação de ponto fixo se o argumento de precisão for grande o suficiente para incluir todos os dígitos da parte inteira do número. Caso contrário, a notação exponencial é usada.
Robusto

Em pelo menos alguns casos, isso não está correto: no meu Firefox, with a = 999999999999999934464;, a.toFixed(0)retorna "1e+21". Talvez uma resposta mais precisa seja que toFixed () não retorne notação exponencial, a menos que toString () retorne.
the paul

1

Por exemplo, consideramos a variável a como, var a = 123,45 a.toPrecisão (6) A saída é 123,450 a.toFixed (6) A saída é semelhante a 123.450000 // 6 dígitos após o ponto decimal


0

Ambas toPrecision()e toFixed()são funções projetadas para formatar um número antes de imprimi-lo. Então, ambos retornam Stringvalores.

Há uma exceção. Se você usar essas funções em um literal numérico negativo , devido à precedência do operador, um número será retornado. O que isso significa é que toFixed()ou toPrecision()retornará uma string primeiro e, em seguida, o- operador menos converterá a string novamente em um número como um valor negativo. Veja abaixo um exemplo.

toPrecision()retorna um Stringrepresentando o objeto Number em notação de ponto fixo ou exponencial arredondado para dígitos significativos. Portanto, se você especificar que deseja uma precisão de 1, ele retornará o primeiro número significativo juntamente com a notação científica para indicar as potências de 10 ou os 0 anteriores antes de seu ponto decimal, se o número significativo for <0.

const num1 = 123.4567;

// if no arguments are passed, it is similar to converting the Number to String
num1.toPrecision();   // returns "123.4567

// scientific notation is used when you pass precision count less than total
// number of digits left of the period
num1.toPrecision(2);  // returns "1.2e+2"

// last digit is rounded if precision is less than total significant digits
num1.toPrecision(4);  // returns "123.5"
num1.toPrecision(5);  // returns "123.46"

const largeNum = 456.789;
largeNum.toPrecision(2);  // returns "4.6e+2"

// trailing zeroes are added if precision is > total digits of the number or float
num1.toPrecision(9);  // returns "123.456700"

const num2 = 123;
num2.toPrecision(4);  // returns "123.0"

const num3 = 0.00123;
num3.toPrecision(4);  // returns "0.001230"
num3.toPrecision(5);  // returns "0.0012300"

// if the number is < 1, precision is by the significant digits
num3.toPrecision(1);  // returns "0.001"

toFixed()retorna um Stringrepresentando o objeto Number na notação de ponto fixo, arredondado para cima. Esta função se importa apenas com os números decimais

const num1 = 123.4567;

// if no argument is passed, the fractions are removed
num1.toFixed();  // returns "123"

// specifying an argument means you the amount of numbers after the decimal point
num1.toFixed(1);  // returns "123.5"
num1.toFixed(3);  // returns "123.457"
num1.toFixed(5);  // returns "123.45670"
num1.toFixed(7);  // returns "123.4567000"

// trying to operator on number literals
2.34.toFixed(1);  // returns "2.3"
2.toFixed(1);     // returns SyntaxError
(2).toFixed(1);   // returns "2.0"
(2.34e+5).toFixed(1);  // returns "234000.0"

Mencionei acima uma exceção em que o uso dessas funções em literais Number negativos retornará um Number e não uma String devido à precedência do operador. aqui estão alguns exemplos:

// Note: these are returning as Number
// toPrecision()
-123.45.toPrecision();  // returns -123.45
-123.45.toPrecision(2);  // returns -120
-123.45.toPrecision(4);  // returns -123.5
-2.34e+2.toPrecision(1);  // returns -200
-0.0456.toPrecision(1);  // returns -0.05
-0.0456.toPrecision(6);  // returns -0.0456

// toFixed()
-123.45.toFixed();  // returns -123.45
-123.45.toFixed(1);  // returns -123.5
-123.45.toFixed(4);  // returns -123.45
-0.0456.toFixed(1);  // returns -0
-0.0456.toFixed(6);  // -0.0456

Curiosidade: existem zeros assinados como vistos em -0.0456.toFixed(1)

Veja: +0 e -0 são iguais?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.