Perbedaan antara toFixed () dan toPrecision ()?

124

Saya baru mengenal JavaScript dan baru saja menemukan toFixed()dan toPrecision()membulatkan angka. Namun, saya tidak tahu apa perbedaan antara keduanya.

Apa perbedaan antara number.toFixed()dan number.toPrecision()?

Jessica
sumber

Jawaban:

133

toFixed(n)memberikan npanjang setelah koma desimal; toPrecision(x)memberikan xpanjang total.

Ref di w3schools: toFixed dan toPrecision

EDIT :
Saya belajar beberapa waktu yang lalu bahwa w3schools bukanlah sumber terbaik, tapi saya lupa tentang jawaban ini sampai saya melihat komentar kzh, eh, "antusias". Berikut adalah referensi tambahan dari Mozilla Doc Center untuktoFixed() dan untuktoPrecision() . Untungnya bagi kita semua, MDC dan w3sekolah setuju satu sama lain dalam kasus ini.

Untuk kelengkapan, saya harus menyebutkan bahwa toFixed()setara dengan toFixed(0)dan toPrecision()hanya mengembalikan nomor asli tanpa pemformatan.

Muncul
sumber
11
Bah, saya memposting ini pada Juli 2010, dan saya tidak belajar tentang w3fools sampai tahun ini. Meskipun orang bodoh benar tentang beberapa hal, tidak semua hal di sekolah salah. Terima kasih telah menunjukkan bahwa saya perlu memperbarui posting ini; akan melakukannya sebentar lagi.
Muncul
24
toPrecision(x)tidak "memberikan xpanjang total", itu memformat ke sejumlah digit signifikan yang diberikan. Misalnya, 0.0000022.toPrecision(1)akan kembali 0.000002.
Andy E
5
Saya baru saja mengunjungi w3fools dan tidak yakin sama sekali. Saya bahkan tidak melihat argumen apapun. Yang saya lihat hanyalah iklan untuk dua situs lainnya.
NiCk Newman
2
Pernyataan "... toPrecision(x)memberikan xpanjang total." tidak selalu berlaku. Contoh penghitung:0.00001234.toPrecision(3)
djvg
59

Saya percaya bahwa yang pertama memberi Anda sejumlah tempat desimal tetap, sedangkan yang terakhir memberi Anda sejumlah digit signifikan yang tetap.

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

Selain itu, toPrecisionakan menghasilkan notasi ilmiah jika terdapat lebih banyak digit bilangan bulat dalam bilangan tersebut daripada presisi yang ditentukan.

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

EDIT: Oh, dan jika Anda baru mengenal JavaScript, saya sangat merekomendasikan buku " JavaScript: The Good Parts " oleh Douglas Crockford.

Tom
sumber
14

Contoh berbicara dengan jelas:

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
bob
sumber
11

Saya pikir ini paling baik dijawab dengan sebuah contoh.

Katakanlah Anda memiliki data berikut:

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

Anda ingin menampilkan setiap produk ini dengan judul dan harga yang diformat. Mari coba gunakan toPrecisiondulu:

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

The price of Really Nice Pen is $150.00

Terlihat bagus, jadi Anda mungkin berpikir ini juga akan berhasil untuk produk lain:

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

Tidak begitu baik. Kita dapat memperbaikinya dengan mengubah jumlah digit signifikan untuk setiap produk, tetapi jika kita mengulangi rangkaian produk, itu bisa rumit. Mari kita gunakan toFixedsebagai gantinya:

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

Ini menghasilkan apa yang Anda harapkan. Tidak perlu menebak, dan tidak ada pembulatan.

McLargeHuge Besar
sumber
7

Hanya:

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

49.99.toPrecision(5)
// → "49.990"
Alexander Mextner
sumber
5

Dalam keadaan tertentu, toPrecision()akan mengembalikan notasi eksponensial, sedangkan toFixed()tidak akan.

Robusto
sumber
Sebenarnya, toExponential()merupakan fungsi tersendiri .
Muncul
4
@Lord Torgamus: Menurut saya salinan Javascript: Panduan pasti , toPrecision (presisi) akan menggunakan notasi fixed-point jika presisi arg cukup besar untuk memasukkan semua digit dari bagian integer dari nomor tersebut. Jika tidak, notasi eksponensial digunakan.
Robusto
Setidaknya dalam beberapa kasus, ini tidak benar: di Firefox saya, dengan a = 999999999999999934464;, a.toFixed(0)kembali "1e+21". Mungkin jawaban yang lebih akurat adalah bahwa toFixed () tidak mengembalikan notasi eksponensial kecuali toString () melakukannya.
paul
1

Sebagai contoh, kita menganggap variabel a sebagai, var a = 123.45 a.toPrecision (6) Outputnya 123.450 a.toFixed (6) Outputnya seperti 123.450000 // 6 digit setelah koma desimal

Sathish Kumar.S Shankaran
sumber
0

Keduanya toPrecision()dan toFixed()merupakan fungsi yang dirancang untuk memformat angka sebelum dicetak. Jadi, keduanya mengembalikan Stringnilai.

Ada satu pengecualian. Jika Anda menggunakan fungsi ini pada literal Angka negatif , karena prioritas operator, Angka dikembalikan. Artinya, toFixed()atau toPrecision()akan mengembalikan string terlebih dahulu, lalu -operator minus akan mengubah string kembali menjadi Angka sebagai nilai negatif. Silakan lihat di bawah untuk contoh.

toPrecision()mengembalikan Stringmewakili objek Angka dalam titik tetap atau notasi eksponensial dibulatkan ke digit signifikan. Jadi jika Anda menetapkan bahwa Anda menginginkan presisi 1, ia mengembalikan angka signifikan pertama bersama dengan notasi ilmiah untuk menunjukkan pangkat 10 atau 0 sebelumnya sebelum titik desimalnya jika bilangan signifikannya <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()mengembalikan Stringmewakili objek Angka dalam notasi titik tetap, dibulatkan. Fungsi ini hanya peduli pada angka koma desimal

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"

Saya sebutkan di atas pengecualian di mana menggunakan fungsi-fungsi ini pada literal Angka negatif akan mengembalikan Angka dan bukan String karena prioritas operator. Berikut beberapa contohnya:

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

Fakta menyenangkan: ada angka nol yang ditandatangani dilihat dari -0.0456.toFixed(1)

Lihat: Apakah +0 dan -0 sama?

philip yoo
sumber