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

124

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

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

Джессика
источник

Ответы:

133

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

Ссылка на w3schools: toFixed и toPrecision

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

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

попса
источник
11
Ба, я опубликовал это в июле 2010 года и узнал о w3fools только в этом году. Хотя в некоторых вещах дураки правы, не все в школах неправильно. Спасибо, что указали, что мне нужно обновить этот пост; сделаю это через немного времени.
Pops
24
toPrecision(x)не «обеспечивает xобщую длину», он форматируется до числа заданных значащих цифр. Например, 0.0000022.toPrecision(1)вернется 0.000002.
Andy E
5
Я только что посетил w3fools и ни в чем не убедился. Я даже не вижу аргументов. Я вижу только рекламу двух других сайтов.
NiCk Newman 08
2
Заявление «... toPrecision(x)обеспечивает xобщую длину». не обязательно выполняется. Пример счетчика:0.00001234.toPrecision(3)
djvg
59

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

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: хорошие части ».

Том
источник
14

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

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

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

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

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

Это дает то, что вы ожидали. Здесь нет никаких догадок и округления.

Большой МакЛарджОгромный
источник
7

Просто:

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

49.99.toPrecision(5)
// → "49.990"
Александр Мекстнер
источник
5

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

Робусто
источник
Собственно, toExponential()это отдельная функция .
Pops
4
@Lord Torgamus: Согласно моей копии Javascript: The Definitive Guide , toPrecision (precision) будет использовать нотацию с фиксированной точкой, если аргумент точности достаточно велик, чтобы включать все цифры целой части числа. В противном случае используется экспоненциальная запись.
Robusto
По крайней мере, в некоторых случаях это неверно: в моем Firefox с a = 999999999999999934464;, a.toFixed(0)возвращает "1e+21". Возможно, более точным ответом будет то, что toFixed () не возвращает экспоненциальную запись, если не toString ().
Павел
1

Например, мы рассматриваем переменную a как, var a = 123.45 a.toPrecision (6) Результатом будет 123.450 a.toFixed (6) Результат будет похож на 123.450000 // 6 цифр после десятичной точки

Сатиш Кумар. С. Шанкаран
источник
0

Оба 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 - это одно и то же?

Филип Ю
источник