2010-07-26 2 views
83

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

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

ответ

104

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

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

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

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

+9

Ба, я отправил это в июле 2010, и я не узнал о w3fools до этого года. Хотя дураки правильны в отношении некоторых вещей, а не все в школах - это неправильно. Спасибо, что указали, что мне нужно обновить этот пост; сделаю это немного. – Pops

+12

'toPrecision (x)' не "предоставляет' x' общую длину ", он форматирует несколько заданных значащих цифр. Например, '0.0000022.toPrecision (1)' вернет '0,000002'. –

+4

Я только что посетил w3fools и не был убежден вообще. Я даже не вижу никаких аргументов. Все, что я вижу, это реклама для двух других сайтов. –

50

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

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

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

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

EDIT: Да, и если вы новичок в JavaScript, я настоятельно рекомендую книгу «JavaScript: The Good Parts» Дуглас Crockford.

4

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

+0

Фактически, 'toExponential()' является [отдельной функцией] (http://www.w3schools.com/jsref/jsref_toexponential.asp). – Pops

+3

@Lord Torgamus: Согласно моей копии * Javascript: The Definitive Guide *, toPrecision (точность) будет использовать нотацию с фиксированной точкой, если аргумент * precision * достаточно велик, чтобы включить все цифры целой части числа. В противном случае используется экспоненциальная нотация. – Robusto

8

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

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

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

Просто:

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

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

Например, рассмотрим переменную а, как, вар а = 123,45 a.toPrecision (6) Выход 123,450 a.toFixed (6) Выход подобно 123.45000000

0

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

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 
Смежные вопросы