Різниця між toFixed () та toPrecision ()?


124

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

У чому різниця між number.toFixed()і number.toPrecision()?

Відповіді:


133

toFixed(n)забезпечує nдовжину після десяткової крапки; toPrecision(x)забезпечує xзагальну довжину.

Посилання на W3Schools: toFixed і toPrecision

EDIT :
Нещодавно я дізнався, що w3schools - це не найкраще джерело, але я забув про цю відповідь, поки не побачив коментаря kzh, uh, "захопленого" коментаря. Ось додаткові відгуки від центру Mozilla Doc дляtoFixed() та дляtoPrecision() . На щастя для всіх нас, MDC та w3schools погоджуються між собою в цьому випадку.

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


11
Ба, я опублікував це в липні 2010 року, і я не дізнався про w3fools до цього року. Незважаючи на те, що дурні відносяться до деяких речей, не все в школах неправильно. Дякую, що вказали, що мені потрібно оновити цю публікацію; зробимо це трохи.
Попс

24
toPrecision(x)не "забезпечує xзагальну довжину", він форматується на ряд заданих значущих цифр. Наприклад, 0.0000022.toPrecision(1)повернеться 0.000002.
Енді Е

5
Я щойно відвідав w3fools і ні в чому не переконався. Я навіть не бачу жодного аргументу. Я бачу лише рекламу двох інших сайтів.
NiCk Newman

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"

EDIT: О, і якщо ви не новачок у 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

Це призводить до того, що ви очікували. Ніякої роботи не здогадується, і округлення немає.



5

За певних обставин toPrecision()повернеться експоненціальні позначення, тоді як toFixed()не буде.


Власне, toExponential()це окрема функція .
Попс

4
@ Lord Torgamus: Відповідно до моєї копії Javascript: Постійне керівництво , toPrecision (точність) використовуватиме позначення з фіксованою точкою, якщо аргумент точності достатньо великий, щоб включити всі цифри цілочисельної частини числа. В іншому випадку використовуються експоненціальні позначення.
Робусто,

Принаймні, у деяких випадках це неправильно: у моєму 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представляючий об'єкт Число у фіксованій або експоненціальній нотації, округленій до значущих цифр. Отже, якщо ви вказуєте, що ви хочете точність 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представляє число в позначенні з фіксованою точкою, округленим. Ця функція стосується лише цифр десяткової крапки

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?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.