Ответы:
toFixed(n)обеспечивает nдлину после десятичной точки; toPrecision(x)обеспечивает xобщую длину.
Ссылка на w3schools: toFixed и toPrecision
РЕДАКТИРОВАТЬ :
Некоторое время назад я узнал, что w3schools не совсем лучший источник, но я забыл об этом ответе, пока не увидел "восторженный" комментарий kzh. Вот дополнительные ссылки из Mozilla Doc Center дляtoFixed()и дляtoPrecision(). К счастью для всех нас, MDC и w3schools согласны друг с другом в этом случае.
Для полноты я должен упомянуть, что toFixed()это эквивалентно toFixed(0)и toPrecision()просто возвращает исходное число без форматирования.
toPrecision(x)не «обеспечивает xобщую длину», он форматируется до числа заданных значащих цифр. Например, 0.0000022.toPrecision(1)вернется 0.000002.
toPrecision(x)обеспечивает xобщую длину». не обязательно выполняется. Пример счетчика:0.00001234.toPrecision(3)
Я считаю, что первый дает вам фиксированное количество десятичных знаков, тогда как последний дает фиксированное количество значащих цифр.
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 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
Я думаю, что на это лучше всего ответить на примере.
Допустим, у вас есть следующие данные:
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
Это дает то, что вы ожидали. Здесь нет никаких догадок и округления.
Просто:
49.99.toFixed(5)
// → "49.99000"
49.99.toPrecision(5)
// → "49.990"
При определенных обстоятельствах toPrecision()вернет экспоненциальную запись, а toFixed()не вернет.
toExponential()это отдельная функция .
a = 999999999999999934464;, a.toFixed(0)возвращает "1e+21". Возможно, более точным ответом будет то, что toFixed () не возвращает экспоненциальную запись, если не toString ().
Например, мы рассматриваем переменную a как, var a = 123.45 a.toPrecision (6) Результатом будет 123.450 a.toFixed (6) Результат будет похож на 123.450000 // 6 цифр после десятичной точки
Оба toPrecision()и toFixed()являются функциями , предназначенными для форматирования номера перед печатью его. Итак, они оба возвращают Stringзначения.
Есть одно исключение. Если вы используете эти функции с отрицательным числовым литералом, из-за приоритета оператора возвращается число. Это означает, что toFixed()или toPrecision()сначала вернет строку, а затем -оператор минус преобразует строку обратно в число как отрицательное значение. См. Пример ниже.
toPrecision()возвращает Stringпредставление объекта Number в формате с фиксированной запятой или экспоненциальной нотации, округленное до значащих цифр. Поэтому, если вы укажете, что вам нужна точность 1, он возвращает первое значащее число вместе с научным представлением, чтобы указать степень 10 или предыдущие 0 перед его десятичной точкой, если значащее число <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()возвращает, Stringпредставляющий объект Number в нотации с фиксированной запятой, с округлением в большую сторону. Эта функция заботится только о числах десятичной точки.
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"
Выше я упоминал об исключении, когда использование этих функций для литералов отрицательных чисел возвращает число, а не строку из-за приоритета оператора. Вот некоторые примеры:
// 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
Интересный факт: есть нули со знаком, как видно из -0.0456.toFixed(1)
Смотрите: +0 и -0 - это одно и то же?