Misalkan saya memiliki nilai 15.7784514, saya ingin menampilkannya 15.77 tanpa pembulatan.
var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));
Hasil dalam -
15.8
15.78
15.778
15.7784514000
Bagaimana cara menampilkan 15.77?
javascript
tempid
sumber
sumber
Jawaban:
Ubah nomor menjadi string, cocokkan angka hingga desimal kedua:
The
toFixed
Metode gagal dalam beberapa kasus sepertitoString
, jadi sangat berhati-hati dengan itu.sumber
toFixed
, meskipun, jadi:(Math.floor(value * 100) / 100).toFixed(2)
. Seperti yang mungkin Anda ketahui, hal-hal presisi aneh dapat terjadi dengan nilai floating point (dan di sisi lain dari spektrum, jika jumlahnya kebetulan15
, terdengar seperti yang diinginkan OP15.00
).Number((15.7784514000*100).toString().match(/^\d+/)/100);
Perbarui 5 Nov 2016
Jawaban baru, selalu akurat
Karena floating point matematika dalam javascript akan selalu memiliki kasus tepi, solusi sebelumnya akan akurat sebagian besar waktu yang tidak cukup baik. Ada beberapa solusi untuk ini seperti
num.toPrecision
, BigDecimal.js , dan accounting.js . Namun, saya percaya bahwa hanya mengurai string akan menjadi yang paling sederhana dan selalu akurat.Mendasarkan pembaruan pada regex yang ditulis dengan baik dari jawaban yang diterima oleh @Gumbo, fungsi toFixed baru ini akan selalu berfungsi seperti yang diharapkan.
Jawaban lama, tidak selalu akurat.
Roll fungsi toFixed Anda sendiri:
sumber
toFixed(0.0000000052, 2)
hasil '5.2'. Ini dapat diperbaiki dengan menggunakanreturn num.toFixed(fixed+1).match(re)[0];
Perhatikan Saya menggunakan toFixed dengan satu tempat desimal di atas target untuk menghindari pembulatan, kemudian menjalankan pertandingan regex AndaSaya memilih untuk menulis ini sebagai gantinya untuk menghapus sisanya dengan string jadi saya tidak harus berurusan dengan masalah matematika yang datang dengan angka:
Ini akan memberi Anda "15,77" dengan num = 15,7784514;
sumber
Oktober 2017
Solusi umum untuk memotong (tanpa pembulatan) angka ke digit desimal ke-n dan mengubahnya menjadi string dengan tepat digit n desimal, untuk setiap n≥0.
di mana x dapat berupa angka (yang akan dikonversi menjadi string) atau string.
Berikut adalah beberapa tes untuk n = 2 (termasuk yang diminta oleh OP):
* Seperti disebutkan dalam catatan, itu karena konversi implisit javascript menjadi eksponensial untuk "1.99e-7" Dan untuk beberapa nilai lain dari n:
sumber
toFixedTrunc(0.000000199, 2) // 1.99
parseInt lebih cepat dari Math.floor
sumber
Ini akan mengembalikan 19,66
sumber
Sederhana lakukan ini
sumber
Solusi ini berhasil, tetapi bagi saya tampaknya tidak perlu rumit. Saya pribadi suka menggunakan operator modulus untuk mendapatkan sisa operasi divisi, dan menghapusnya. Dengan asumsi bahwa num = 15.7784514:
Ini sama dengan mengatakan num = num - (num% .01).
sumber
Jawaban di sini tidak membantu saya, itu terus mengumpulkan atau memberi saya desimal yang salah.
solusi saya mengubah desimal Anda menjadi string, mengekstraksi karakter dan kemudian mengembalikan semuanya sebagai angka.
sumber
Versi saya untuk angka positif:
Cepat, cantik, jelas. (versi untuk angka positif)
sumber
-0.7752
. Tes itutoFixed_norounding(-0.7752,2)
kembali-0.78
sebagai ganti-0.77
Kode berikut berfungsi sangat baik untuk saya:
sumber
-?
;)Saya tetap menggunakan cara sederhana berikut-
Hasilnya akan menjadi 15,77
sumber
-15.7784514
pengembalian-15.78
Potong saja digit:
sumber
Solusi single-line lain:
Saya menggunakan 100 karena Anda ingin memotong ke digit kedua, tetapi solusi yang lebih fleksibel adalah:
di mana digit adalah jumlah digit desimal yang harus disimpan.
Lihat spesifikasi Math.trunc untuk detail dan kompatibilitas browser.
sumber
Ini dia. Jawaban yang menunjukkan cara lain untuk menyelesaikan masalah:
Perhatikan penggunaan + sebelum ekspresi akhir. Yaitu untuk mengubah string terpotong kami yang terpotong kembali ke tipe angka.
Semoga ini bisa membantu!
sumber
terpotong tanpa nol
atau
uji:
terpotong dengan nol
uji:
sumber
Ini bekerja dengan baik untuk saya. Saya harap ini akan memperbaiki masalah Anda juga.
sumber
Cara mudah untuk melakukannya adalah yang berikutnya tetapi perlu memastikan bahwa parameter jumlah diberikan sebagai string.
}
sumber
sumber
Saya menggunakan
(num-0.05).toFixed(1)
desimal kedua.sumber
Solusi saya dalam naskah (dapat dengan mudah porting ke JS):
Kasus uji:
Adakah perbaikan?
sumber
Gulung
toFixed
fungsi Anda sendiri : agar nilai positifMath.floor
berfungsi dengan baik.Untuk nilai negatif
Math.floor
adalah nilai bulat. Jadi Anda bisa menggunakannyaMath.ceil
.Contoh,
sumber
Solusi kedua Gumbo, dengan ekspresi reguler, berfungsi tetapi lambat karena ekspresi reguler. Solusi pertama Gumbo gagal dalam situasi tertentu karena ketidaktepatan dalam angka floating point. Lihat JSFiddle untuk demonstrasi dan tolok ukur. Solusi kedua membutuhkan sekitar 1636 nanodetik per panggilan pada sistem saya saat ini, Intel Core i5-2500 CPU pada 3,30 GHz.
Solusi yang saya tulis melibatkan penambahan kompensasi kecil untuk menjaga ketidaktepatan floating point. Ini pada dasarnya instan, yaitu pada urutan nanodetik. Saya mencatat 2 nanodetik per panggilan tetapi pengatur waktu JavaScript tidak terlalu tepat atau terperinci. Ini JS Fiddle dan kodenya.
sumber
Membangun jawaban David D :
sumber
Lebih dapat diandalkan untuk mendapatkan dua poin mengambang tanpa pembulatan.
Jawaban Referensi
Terima kasih !
sumber
Sudah ada beberapa jawaban yang cocok dengan ekspresi reguler dan perhitungan aritmatika, Anda juga dapat mencoba ini
sumber
Inilah yang dilakukan dengan string
sumber
Semua jawaban ini agak rumit. Saya hanya akan mengurangi 0,5 dari nomor Anda dan gunakan toFixed ().
sumber
Solusi paling efisien (untuk 2 digit pecahan) adalah dengan mengurangi 0,005 sebelum menelepon
toFixed()
Angka negatif juga akan dibulatkan ke bawah (jauh dari nol). OP tidak memberi tahu apa-apa tentang angka negatif.
sumber
Saya tahu sudah ada beberapa contoh kerja, tapi saya pikir layak untuk mengusulkan setara String.toFixed saya, beberapa mungkin merasa bermanfaat.
Itu alternatif toFixed saya, yang tidak membulatkan angka, hanya memotongnya atau menambahkan nol sesuai dengan presisi yang diberikan. Untuk angka ekstra panjang ia menggunakan pembulatan bawaan JS saat presisi terlalu panjang. Fungsi berfungsi untuk semua nomor bermasalah yang saya temukan di tumpukan.
Ingatlah bahwa presisi mungkin tidak ditangani dengan benar untuk jumlah panjang 18 dan lebih besar, misalnya Chrome 64-bit akan membulatkannya atau menambahkan "e +" / "e-" untuk menjaga panjang angka pada 18.
Jika Anda ingin melakukan operasi pada bilangan real, lebih aman untuk melipatgandakannya
Math.sqrt(10, precision)
terlebih dahulu, membuat perhitungan, lalu menyelam hasilnya dengan nilai pengganda.Contoh:
Itulah mengapa sangat penting untuk menggunakan pengganda / pembagi seperti itu ketika berhadapan dengan bilangan real dalam javascript, terutama ketika Anda sedang menghitung uang ...
sumber