Разница между toFixed () и toPrecision ()? - PullRequest
109 голосов
/ 26 июля 2010

Я новичок в JavaScript и только что обнаружил toFixed() и toPrecision() для округления чисел.Однако я не могу понять, в чем разница между ними.

В чем разница между number.toFixed() и number.toPrecision()?

Ответы [ 7 ]

122 голосов
/ 26 июля 2010

toFixed(n) обеспечивает n длину после десятичной точки; toPrecision(x) обеспечивает x общая длина.

Ref в w3schools: toFixed и toPrecision

EDIT
Некоторое время назад я узнал, что w3schools - не самый лучший источник, но я забыл об этом ответе, пока не увидел «восторженный» комментарий kzh. Вот дополнительные ссылки из Mozilla Doc Center для toFixed() и для toPrecision(). К счастью для всех нас, MDC и w3schools согласны друг с другом в этом случае.

Для полноты я должен отметить, что toFixed() эквивалентно toFixed(0), а toPrecision() просто возвращает исходное число без форматирования.

55 голосов
/ 26 июля 2010

Я считаю, что первое дает вам фиксированное количество десятичных знаков, тогда как второе дает вам фиксированное количество значащих цифр.

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

Кроме того, toPrecision даст научную запись если в числе больше целых цифр, чем указанная точность.

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

РЕДАКТИРОВАТЬ: Да, и если вы новичок в JavaScript, я настоятельно рекомендую книгу " JavaScript:Хорошие части"Дугласа Крокфорда.

9 голосов
/ 20 марта 2014

Я думаю, что лучше ответить на пример.

Допустим, у вас есть следующие данные:

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

Вы хотите отобразить каждый из этих продуктов с заголовком и форматированной ценой. Давайте сначала попробуем использовать toPrecision:

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

The price of Really Nice Pen is $150.00

Выглядит хорошо, поэтому вы можете подумать, что это будет работать и для других продуктов:

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

Не очень хорошо. Мы можем исправить это, изменив количество значащих цифр для каждого продукта, но если мы перебираем массив продуктов, который может быть сложным. Давайте использовать 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

Это производит то, что вы ожидали. Здесь нет работы по угадыванию и округлений.

6 голосов
/ 20 февраля 2018

Примеры говорят ясно:

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
6 голосов
/ 08 сентября 2015

Просто:

49.99.toFixed(5)
// → "49.99000"

49.99.toPrecision(5)
// → "49.990"
4 голосов
/ 26 июля 2010

При определенных обстоятельствах toPrecision() вернет экспоненциальную запись, тогда как toFixed() - нет.

1 голос
/ 09 сентября 2015

Например, мы рассматриваем переменную a как, var a = 123,45 a.toPrecision (6) Выход 123.450 a.toFixed (6) Выходные данные выглядят как 123.450000 // 6 цифр после десятичной точки

...