Sự khác biệt giữa toFixed () và toPre precision ()?


124

Tôi mới làm quen với JavaScript và mới khám phá toFixed()toPrecision()làm tròn số. Tuy nhiên, tôi không thể tìm ra sự khác biệt giữa hai điều này.

Sự khác biệt giữa number.toFixed()và là number.toPrecision()gì?

Câu trả lời:


133

toFixed(n)cung cấp nđộ dài sau dấu thập phân; toPrecision(x)cung cấp xtổng chiều dài.

Tham khảo tại w3schools: toFixed and toPre precision

CHỈNH SỬA :
Một thời gian trước, tôi biết được rằng w3schools không phải là nguồn tốt nhất, nhưng tôi đã quên câu trả lời này cho đến khi tôi thấy nhận xét "nhiệt tình" của kzh. Dưới đây là các tham khảo bổ sung từ Trung tâm Tài liệu Mozilla chotoFixed()chotoPrecision() . May mắn thay cho tất cả chúng tôi, MDC và w3schools đồng ý với nhau trong trường hợp này.

Để đầy đủ, tôi nên đề cập rằng toFixed()tương đương với toFixed(0)toPrecision()chỉ trả về số ban đầu mà không có định dạng.


11
Bah, tôi đã đăng bài này vào tháng 7 năm 2010 và tôi đã không tìm hiểu về w3fools cho đến năm nay. Mặc dù những người ngu đều đúng về một số điều, nhưng không phải mọi thứ trên trường học đều sai. Cảm ơn vì đã chỉ ra rằng tôi cần cập nhật bài đăng này; sẽ làm điều đó trong một chút.
Pops

24
toPrecision(x)không "cung cấp xtổng chiều dài", nó định dạng thành một số chữ số có nghĩa nhất định. Ví dụ, 0.0000022.toPrecision(1)sẽ trở lại 0.000002.
Andy E

5
Tôi vừa truy cập w3fools và không bị thuyết phục về điều gì. Tôi thậm chí không thấy bất kỳ cuộc tranh cãi nào. Tất cả những gì tôi thấy là quảng cáo cho hai trang web khác.
NiCk Newman

2
Câu lệnh "... toPrecision(x)cung cấp xtổng chiều dài." không nhất thiết phải giữ. Ví dụ về bộ đếm:0.00001234.toPrecision(3)
djvg

59

Tôi tin rằng cái trước cung cấp cho bạn một số chữ số thập phân cố định, trong khi cái sau cung cấp cho bạn một số chữ số có nghĩa cố định.

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

Hơn nữa, toPrecisionsẽ mang lại ký hiệu khoa học nếu có nhiều chữ số nguyên trong số hơn độ chính xác được chỉ định.

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

CHỈNH SỬA: Ồ, và nếu bạn chưa quen với JavaScript, tôi rất có thể giới thiệu cuốn sách " JavaScript: The Good Parts " của Douglas Crockford.


14

Ví dụ nói rõ ràng:

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

Tôi nghĩ rằng điều này được trả lời tốt nhất với một ví dụ.

Giả sử bạn có dữ liệu sau:

var products = [
  {
    "title": "Really Nice Pen",
    "price": 150
  },
  {
    "title": "Golf Shirt",
    "price": 49.99
  },
  {
    "title": "My Car",
    "price": 1234.56
  }
]

Bạn muốn hiển thị từng sản phẩm này với tiêu đề và giá được định dạng. Hãy thử sử dụng toPrecisiontrước:

document.write("The price of " + products[0].title + " is $" + products[0].price.toPrecision(5));

The price of Really Nice Pen is $150.00

Có vẻ tốt, vì vậy bạn có thể nghĩ rằng điều này cũng sẽ hiệu quả với các sản phẩm khác:

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

Không tốt như vậy. Chúng tôi có thể khắc phục điều này bằng cách thay đổi số lượng chữ số có nghĩa cho mỗi sản phẩm, nhưng nếu chúng tôi lặp đi lặp lại một mảng sản phẩm có thể khó khăn. Hãy sử dụng toFixedthay thế:

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

Điều này tạo ra những gì bạn mong đợi. Không có công việc phỏng đoán liên quan, và không có làm tròn.



5

Trong một số trường hợp nhất định, toPrecision()sẽ trả về ký hiệu hàm mũ, trong khi toFixed()thì không.


Trên thực tế, toExponential()là một chức năng riêng biệt .
Pops

4
@Lord Torgamus: Theo bản sao của tôi về Javascript: The Definitive Guide , toPre precision (độ chính xác) sẽ sử dụng ký hiệu điểm cố định nếu đối số chính xác đủ lớn để bao gồm tất cả các chữ số của phần nguyên của số. Nếu không, ký hiệu hàm mũ được sử dụng.
Robusto

Trong ít nhất một số trường hợp, điều này không đúng: trong Firefox của tôi, với a = 999999999999999934464;, a.toFixed(0)trả về "1e+21". Có lẽ một câu trả lời chính xác hơn sẽ là toFixed () không trả về ký hiệu hàm mũ trừ khi toString () thực hiện.
paul

1

Ví dụ, chúng ta coi biến a as, var a = 123.45 a.toPrechure (6) Đầu ra là 123.450 a.toFixed (6) Đầu ra giống như 123.450000 // 6 chữ số sau dấu thập phân


0

Cả hai toPrecision()toFixed()đều là các chức năng được thiết kế để định dạng một số trước khi in ra. Vì vậy, cả hai đều trả về Stringgiá trị.

Có một ngoại lệ. Nếu bạn sử dụng các hàm này trên một chữ Số âm , do toán tử ưu tiên, một Số được trả về. Điều này có nghĩa là toFixed()hoặc toPrecision()sẽ trả về một chuỗi trước tiên, và sau đó -toán tử trừ sẽ chuyển đổi chuỗi trở lại một Số dưới dạng giá trị âm. Vui lòng xem ví dụ bên dưới.

toPrecision()trả về một Stringđại diện cho đối tượng Number trong ký hiệu điểm cố định hoặc hàm mũ được làm tròn đến chữ số có nghĩa. Vì vậy, nếu bạn chỉ định rằng bạn muốn độ chính xác là 1, nó sẽ trả về số có nghĩa đầu tiên cùng với ký hiệu khoa học để chỉ ra lũy thừa của 10 hoặc số 0 trước dấu thập phân của nó nếu số có nghĩa là <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()trả về một Stringđại diện cho đối tượng Number trong ký hiệu điểm cố định, được làm tròn lên. Hàm này chỉ quan tâm đến các số thập phân

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"

Tôi đã đề cập ở trên một ngoại lệ trong đó việc sử dụng các hàm này trên các ký tự Số âm sẽ trả về Số chứ không phải Chuỗi do toán tử ưu tiên. Dưới đây là một số ví dụ:

// 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

Thực tế thú vị: có các số 0 có dấu như được nhìn thấy từ -0.0456.toFixed(1)

Hãy xem: +0 và -0 có giống nhau không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.