Saya memiliki baris kode ini yang membulatkan angka saya ke dua tempat desimal. Tetapi saya mendapatkan angka seperti ini: 10.8, 2.4, dll. Ini bukan ide saya tentang dua tempat desimal jadi bagaimana saya dapat meningkatkan yang berikut?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
Saya ingin angka seperti 10.80, 2.40, dll. Penggunaan jQuery tidak masalah bagi saya.
0.565
,0.575
,1.005
), dapat saya sarankan melihat lagi jawaban ini , yang membuat mereka benar?number.toFixed(x)
metode ini untuk mengubahnya menjadi string dengan jumlah nol yang diperlukan. Misalnya bulat1.34
dengan1.3
dengan metode cross-browser kemudian tambahkan 1 nol dan konversi ke string dengan1.3.toFixed(2)
(untuk mendapatkan"1.30"
).Jawaban:
Untuk memformat angka menggunakan notasi titik tetap, Anda cukup menggunakan metode toFixed :
Perhatikan bahwa
toFixed()
mengembalikan string.PENTING : Perhatikan bahwa toFixed tidak membulatkan 90% dari waktu, itu akan mengembalikan nilai bulat, tetapi untuk banyak kasus, itu tidak berfungsi.
Contohnya:
2.005.toFixed(2) === "2.00"
MEMPERBARUI:
Saat ini, Anda dapat menggunakan
Intl.NumberFormat
konstruktor. Itu bagian dari Spesifikasi API Internasionalisasi Script ECMAS (ECMA402). Ini memiliki cukup dukungan yang baik peramban , bahkan termasuk IE11, dan itu didukung sepenuhnya di Node.js .Anda juga dapat menggunakan
toLocaleString
metode ini, yang secara internal akan menggunakanIntl
API:API ini juga memberi Anda beragam opsi untuk diformat, seperti ribuan pemisah, simbol mata uang, dll.
sumber
(0.09).toFixed(1);
memberi 0,0 di IE8Math.Round(0.09)
akan kembali0
sehingga ini akan selalu memberi0.0
...Math.round(value*100)/100
berfungsi lebih baik untuk 2DP.Ini adalah topik lama tetapi hasil Google masih peringkat teratas dan solusi yang ditawarkan berbagi masalah desimal titik mengambang yang sama. Ini adalah fungsi (sangat umum) yang saya gunakan, terima kasih kepada MDN :
Seperti yang bisa kita lihat, kita tidak mendapatkan masalah ini:
Kemurahan hati ini juga menyediakan beberapa hal keren:
Sekarang, untuk menjawab pertanyaan OP, kita harus mengetik:
Atau, untuk fungsi yang lebih ringkas, kurang generik:
Anda dapat menyebutnya dengan:
Berbagai contoh dan tes (terima kasih kepada @ tj-crowder !):
Tampilkan cuplikan kode
sumber
Saya biasanya menambahkan ini ke perpustakaan pribadi saya, dan setelah beberapa saran dan menggunakan solusi @TIMINeutron juga, dan membuatnya dapat disesuaikan untuk panjang desimal, yang ini paling cocok:
akan bekerja untuk pengecualian yang dilaporkan.
sumber
Saya tidak tahu mengapa saya tidak dapat menambahkan komentar pada jawaban sebelumnya (mungkin saya buta tanpa harapan, tidak tahu), tetapi saya menemukan solusi menggunakan jawaban @ Miguel:
Dan dua komentarnya (dari @bighostkim dan @Imre):
precise_round(1.275,2)
tidak mengembalikan 1.28precise_round(6,2)
tidak mengembalikan 6,00 (seperti yang dia inginkan).Solusi terakhir saya adalah sebagai berikut:
Seperti yang Anda lihat saya harus menambahkan sedikit "koreksi" (bukan itu yang sebenarnya, tetapi karena Math.round adalah lossy - Anda dapat memeriksanya di jsfiddle.net - ini adalah satu-satunya cara saya tahu bagaimana "memperbaiki" " Itu). Itu menambahkan 0,001 ke angka yang sudah empuk, jadi itu menambahkan
1
tiga0
s di sebelah kanan nilai desimal. Jadi harus aman digunakan.Setelah itu saya menambahkan
.toFixed(decimal)
untuk selalu menampilkan angka dalam format yang benar (dengan jumlah desimal yang tepat).Jadi cukup banyak. Gunakan dengan baik;)
EDIT: menambahkan fungsionalitas ke "koreksi" angka negatif.
sumber
precise_round(1.27499,2)
sekarang juga mengembalikan 1,28 ... Itu tidakMath.round
rugi; cara komputer secara internal menyimpan nilai floating point adalah. Pada dasarnya, Anda pasti gagal dengan beberapa nilai sebelum data bahkan sampai ke fungsi Anda :)Salah satu cara untuk menjadi 100% yakin bahwa Anda mendapatkan nomor dengan 2 desimal:
Jika ini menyebabkan kesalahan pembulatan, Anda dapat menggunakan yang berikut seperti yang dijelaskan James dalam komentarnya:
sumber
var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Gunakan metode ini di bawah ini
DAN jika Anda ingin nomor diperbaiki, gunakan
sumber
Saya tidak menemukan solusi yang akurat untuk masalah ini, jadi saya buat sendiri:
Contoh:
sumber
@heridev dan saya membuat fungsi kecil di jQuery.
Anda dapat mencoba selanjutnya:
HTML
jQuery
DEMO ONLINE:
http://jsfiddle.net/c4Wqn/
sumber
input
acara. Ini tidak menciptakan efek kedipan dan juga menyala saat Anda mengakses bidang dengan JSMasalahnya dengan nilai floating point adalah mereka mencoba untuk mewakili jumlah tak terhingga dari nilai (kontinu) dengan jumlah bit yang tetap. Jadi secara alami, pasti ada beberapa kerugian dalam permainan, dan Anda akan digigit dengan beberapa nilai.
Ketika komputer menyimpan 1.275 sebagai nilai floating point, itu tidak akan benar-benar mengingat apakah itu 1.275 atau 1.27499999999999993, atau bahkan 1.27500000000000002.0. Nilai-nilai ini harus memberikan hasil yang berbeda setelah membulatkan ke dua desimal, tetapi tidak akan, karena untuk komputer mereka terlihat sama persis setelah disimpan sebagai nilai floating point, dan tidak ada cara untuk mengembalikan data yang hilang. Setiap perhitungan lebih lanjut hanya akan mengakumulasi ketidaktepatan tersebut.
Jadi, jika presisi penting, Anda harus menghindari nilai floating point dari awal. Opsi yang paling sederhana adalah
Misalnya, ketika menggunakan bilangan bulat untuk menyimpan jumlah seratus, fungsi untuk menemukan nilai sebenarnya cukup sederhana:
Dengan string, Anda perlu pembulatan, tetapi masih dapat dikelola:
Perhatikan bahwa fungsi ini membulatkan ke terdekat, mengikat jauh dari nol , sementara IEEE 754 merekomendasikan pembulatan ke terdekat, mengikat bahkan sebagai perilaku default untuk operasi floating point. Modifikasi semacam itu dibiarkan sebagai latihan bagi pembaca :)
sumber
Ini yang sederhana
Gunakan seperti
alert(roundFloat(1.79209243929,4));
Jsfiddle
sumber
Bulatkan nilai desimal Anda, lalu gunakan
toFixed(x)
untuk angka yang Anda harapkan.Panggilan
parseDecimalRoundAndFixed (10.800243929,4) => 10.80 parseDecimalRoundAndFixed (10.807243929,2) => 10.81
sumber
Membulatkan ke bawah
Pembulatan
Sekitar terdekat
sumber
sumber
Inilah solusi 1-line saya:
Number((yourNumericValueHere).toFixed(2));
Inilah yang terjadi:
1) Pertama, Anda menerapkan
.toFixed(2)
ke nomor yang Anda ingin membulatkan tempat desimal. Perhatikan bahwa ini akan mengubah nilai menjadi string dari angka. Jadi, jika Anda menggunakan TypeScript, itu akan menimbulkan kesalahan seperti ini:"Ketik 'string' tidak dapat ditentukan untuk mengetik 'angka'"
2) Untuk mendapatkan kembali nilai numerik atau untuk mengubah string ke nilai numerik, cukup terapkan
Number()
fungsi pada apa yang disebut nilai 'string'.Untuk klarifikasi, lihat contoh di bawah ini:
CONTOH: Saya memiliki jumlah yang memiliki hingga 5 digit di tempat desimal dan saya ingin mempersingkatnya menjadi hingga 2 tempat desimal. Saya melakukannya seperti ini:
sumber
Letakkan yang berikut ini di beberapa ruang lingkup global:
dan kemudian coba :
Memperbarui
Perhatikan bahwa
toFixed()
hanya dapat bekerja untuk jumlah desimal antara0-20
yaitua.getDecimals(25)
dapat menghasilkan kesalahan javascript, sehingga untuk mengakomodasi bahwa Anda dapat menambahkan beberapa pemeriksaan tambahan yaitusumber
ini akan mengembalikan angka acak dari 1 hingga 100 dibulatkan ke 2 tempat desimal.
sumber
Ini bekerja untuk saya: Membulatkan Desimal dalam JavaScript
sumber
Menggunakan respons ini dengan referensi: https://stackoverflow.com/a/21029698/454827
Saya membangun fungsi untuk mendapatkan angka desimal dinamis:
di sini contoh kerja: https://jsfiddle.net/wpxLduLc/
sumber
sumber
Dengan contoh-contoh ini Anda masih akan mendapatkan kesalahan saat mencoba membulatkan angka 1,005 solusinya adalah dengan menggunakan perpustakaan seperti Math.js atau fungsi ini:
sumber
Saya mendapat beberapa gagasan dari posting ini beberapa bulan yang lalu, tetapi tidak ada jawaban di sini, maupun jawaban dari posting / blog lain yang dapat menangani semua skenario (mis. Angka negatif dan beberapa "angka keberuntungan" yang ditemukan oleh penguji kami). Pada akhirnya, penguji kami tidak menemukan masalah dengan metode ini di bawah ini. Menempelkan cuplikan kode saya:
Saya juga punya komentar kode (maaf saya sudah lupa semua detailnya) ... Saya memposting jawaban saya di sini untuk referensi di masa mendatang:
sumber
Saya memperbaiki masalah pengubah. Hanya mendukung 2 desimal.
sumber
Itu harus menghasilkan:
10.20
Itu harus menghasilkan:
0.05
Itu harus menghasilkan:
4.04
dll.
sumber
sumber
Ini sangat sederhana dan berfungsi sama baiknya dengan yang lain:
Karena toFixed () hanya dapat dipanggil pada angka, dan sayangnya mengembalikan sebuah string, ini membuat semua parsing untuk Anda di kedua arah. Anda dapat melewati string atau angka, dan Anda mendapatkan nomor kembali setiap kali! Memanggil parseNumber (1,49) akan memberi Anda 1, dan parseNumber (1,49,2) akan memberi Anda 1,50. Sama seperti yang terbaik dari mereka!
sumber
Anda juga bisa menggunakan
.toPrecision()
metode dan beberapa kode khusus, dan selalu membulatkan ke angka desimal ke-n terlepas dari panjang bagian int.Anda juga bisa menjadikannya plugin untuk penggunaan yang lebih baik.
sumber
Sesederhana ini.
sumber
Saya menemukan cara yang sangat sederhana yang memecahkan masalah ini untuk saya dan dapat digunakan atau diadaptasi:
sumber
100% berfungsi !!! Cobalah
sumber