Dalam JavaScript, ketika mengkonversi dari float ke string, bagaimana saya bisa mendapatkan hanya 2 digit setelah titik desimal? Misalnya, 0,34 bukannya 0,3445434.
427
Dalam JavaScript, ketika mengkonversi dari float ke string, bagaimana saya bisa mendapatkan hanya 2 digit setelah titik desimal? Misalnya, 0,34 bukannya 0,3445434.
Jawaban:
Spesifikasinya , jika kodenya tidak jelas.
sunting: ... atau gunakan saja
toFixed
, seperti yang diusulkan oleh Tim Büthe . Lupa itu, terima kasih (dan upvote) untuk pengingat :)sumber
toFixed()
akan meniru apa yang dilakukan sesuatuprintf()
dalam C. Namun,toFixed()
danMath.round()
akan menangani pembulatan berbeda. Dalam hal ini,toFixed()
akan memiliki efek yang samaMath.floor()
akan (jika Anda mengalikan aslinya dengan 10 ^ n sebelumnya, dan menelepontoFixed()
dengan n digit). "Kebenaran" jawabannya sangat tergantung pada apa yang diinginkan OP di sini, dan keduanya "benar" dengan caranya sendiri.Ada fungsi untuk membulatkan angka. Sebagai contoh:
akan mencetak 5.04.
EDIT: Fiddle
sumber
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
akan sama"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
...Hati-hati saat menggunakan
toFixed()
:Pertama, pembulatan angka dilakukan dengan menggunakan representasi biner dari angka tersebut, yang dapat menyebabkan perilaku yang tidak terduga. Sebagai contoh
bukannya
'0.6'
.Kedua, ada bug IE dengan
toFixed()
. Di IE (setidaknya hingga versi 7, tidak memeriksa IE8), hal berikut ini berlaku:Mungkin ide yang baik untuk mengikuti saran kkyy atau menggunakan
toFixed()
fungsi kustom , misalnyasumber
.toFixed()
metode asli dalam nilai kembali, yang akan menambah jumlah presisi yang diperlukan, misalnya:return (Math.round(value * power) / power).toFixed(precision);
dan juga mengembalikan nilai sebagai string. Jika tidak, ketelitian 20 diabaikan untuk desimal yang lebih keciltoFixed
: perhatikan bahwa meningkatkan presisi dapat menghasilkan hasil yang tidak terduga:,(1.2).toFixed(16) === "1.2000000000000000"
sementara(1.2).toFixed(17) === "1.19999999999999996"
(di Firefox / Chrome; di IE8 yang terakhir tidak berlaku karena presisi yang lebih rendah yang ditawarkan IE8 secara internal).(0.598).toFixed(2)
tidak menghasilkan0.6
. Ini menghasilkan0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Satu lagi masalah yang harus diperhatikan, adalah yang
toFixed()
dapat menghasilkan nol yang tidak perlu di akhir angka. Sebagai contoh:Idenya adalah untuk membersihkan output menggunakan
RegExp
:Yang
RegExp
cocok dengan trailing nol (dan opsional titik desimal) untuk memastikan itu terlihat bagus untuk bilangan bulat juga.sumber
sumber
Ada masalah dengan semua solusi yang beredar menggunakan pengganda. Sayangnya, solusi kkyy dan Christoph salah.
Silakan uji kode Anda untuk nomor 551.175 dengan 2 tempat desimal - itu akan membulatkan ke 551.17 sementara itu harus 551.18 ! Tetapi jika Anda menguji mantan. 451.175 itu akan baik-baik saja - 451.18. Jadi sulit untuk menemukan kesalahan ini pada pandangan pertama.
Masalahnya adalah dengan mengalikan: coba 551.175 * 100 = 55117.49999999999 (ups!)
Jadi ide saya adalah memperlakukannya dengan toFixed () sebelum menggunakan Math.round ();
sumber
toFixed
terpengaruh juga -(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
... Metode apa pun yang digunakan, lebih baik tambahkan epsilon sebelum pembulatan.Kuncinya di sini saya kira adalah untuk mengumpulkan dengan benar terlebih dahulu, maka Anda dapat mengubahnya menjadi String.
Sekarang Anda dapat dengan aman memformat nilai ini dengan toFixed (p). Jadi dengan kasus spesifik Anda:
sumber
Jika Anda menginginkan string tanpa putaran, Anda dapat menggunakan RegEx ini (mungkin bukan cara yang paling efisien ... tetapi sangat mudah)
sumber
sumber
return float_part ? int_part+'.'+float_part : int_part;
sebaliknya jika Anda melewati Integer, itu kembali nomor dengan titik di akhir (contoh masukan:2100
, keluaran:2100.
)Mungkin Anda juga ingin pemisah desimal? Ini adalah fungsi yang baru saja saya buat:
sumber
Tidak ada cara untuk menghindari pembulatan yang tidak konsisten untuk harga dengan x.xx5 sebagai nilai aktual menggunakan perkalian atau pembagian. Jika Anda perlu menghitung harga yang benar di sisi klien, Anda harus menyimpan semua jumlah sen. Ini karena sifat representasi internal dari nilai numerik dalam JavaScript. Perhatikan bahwa Excel menderita masalah yang sama sehingga kebanyakan orang tidak akan melihat kesalahan kecil yang disebabkan oleh fenomena ini. Namun kesalahan dapat menumpuk setiap kali Anda menambahkan banyak nilai yang dihitung, ada teori keseluruhan tentang ini yang melibatkan urutan perhitungan dan metode lain untuk meminimalkan kesalahan dalam hasil akhir. Untuk menekankan pada masalah dengan nilai desimal, harap dicatat bahwa 0,1 + 0,2 tidak persis sama dengan 0,3 dalam JavaScript, sedangkan 1 + 2 sama dengan 3.
sumber
sumber
Saya menggunakan kode ini untuk memformat pelampung. Ini didasarkan pada
toPrecision()
tetapi strip nol yang tidak perlu. Saya akan menyambut saran untuk bagaimana menyederhanakan regex.Contoh penggunaan:
sumber