Разница между toFixed() и toPrecision()?


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

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

7 95

7 ответов:

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

Ref at w3schools:toFixed и toPrecision

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

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

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

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: Хорошие Части" Дугласа Крокфорд.

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

скажем, у вас есть следующие данные:

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 0.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 .990
The price of My Car is 34.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 0.00
The price of Golf Shirt is .99
The price of My Car is 34.56

это дает то, что вы ожидали. Нет никакой работы по угадыванию, и нет округления.

всего:

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

49.99.toPrecision(5)
// → "49.990"

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

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

var A = 123.456789;

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()      // --- ERROR --- 
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

например, мы рассматриваем переменную a как, var a = 123.45 a. toPrecision(6) Выход 123.450 a. toFixed(6) Выход, как 123.45000000