Saya ingin mengonversi float ke seluruh angka dalam JavaScript. Sebenarnya, saya ingin tahu bagaimana melakukan KEDUA konversi standar: dengan memotong dan membulatkan. Dan efisien, bukan melalui konversi ke string dan parsing.
javascript
syntax
mcherm
sumber
sumber
Jawaban:
Referensi objek matematika
Contohnya
Positif Negatif Positif - Angka yang lebih besar Negatif - Angka yang lebih besarsumber
var intValue = ~~floatValue;
. Jika notasi terlalu mengaburkan untuk selera Anda, hanya menyembunyikannya dalam suatu fungsi:function toInt(value) { return ~~value; }
. (Ini juga mengubah string menjadi bilangan bulat, jika Anda mau melakukannya.)Math.trunc(val);
Komentar karena ini adalah jawaban yang diterima2.3 - 2.3 % 1
Bitwise ATAU operator
Bitwise atau operator dapat digunakan untuk memotong angka floating point dan berfungsi untuk positif maupun negatif:
Hasil
Perbandingan kinerja?
Saya telah membuat tes JSPerf yang membandingkan kinerja antara:
Math.floor(val)
val | 0
bitwise ATAU~~val
bitwise TIDAKparseInt(val)
yang hanya berfungsi dengan angka positif. Dalam hal ini Anda aman untuk menggunakan operasi bitwise sebaik
Math.floor
fungsinya.Tetapi jika Anda membutuhkan kode Anda untuk bekerja dengan positif dan negatif , maka operasi bitwise adalah yang tercepat (ATAU menjadi yang disukai). Tes JSPerf lainnya ini membandingkan hal yang sama di mana cukup jelas bahwa karena tanda tambahan memeriksa Matematika sekarang paling lambat dari empat.
Catatan
Sebagaimana dinyatakan dalam komentar, operator BITWISE beroperasi pada bilangan bulat 32bit yang ditandatangani, oleh karena itu sejumlah besar akan dikonversi, contoh:
sumber
Math.floor()
lebih cepat (setidaknya menurut saya menjalankan tes JSPerf pertama Anda di Google Chrome, versi 30.0.1599.101), lebih kuat (karena tidak tergantung pada bagaimana angka diwakili dalam bit, yang mungkin berubah dan mungkin merusak solusi bitwise ini), dan yang paling penting, lebih eksplisit.~~
lebih baik karena ini adalah operator unary.4.2|0+4
sama dengan4
tetapi~~4.2+4
sama8
Catatan: Anda tidak dapat menggunakan
Math.floor()
sebagai pengganti truncate, karenaMath.floor(-3.1) = -4
dan tidak-3
!!Pengganti yang benar untuk truncate adalah:
sumber
Math.trunc(value)
ditambahkan dalam ECMAScript 6floor
putaran menuju -infinity,truncate
putaran menuju nol. (ceil
putaran menuju + tak terhingga).Operator bitwise ganda tidak dapat digunakan untuk memotong float. Operasi lain yang Anda sebutkan tersedia melalui
Math.floor
,Math.ceil
, danMath.round
.Lebih detail dari James Padolsey.
sumber
<canvas>
di JS . Terima kasih!Untuk memotong:
Untuk putaran:
sumber
Anda bisa menggunakan metode parseInt tanpa pembulatan. Hati-hati dengan input pengguna karena awalan 0x (hex) dan 0 (oktal).
sumber
parseInt(1000000000000000000000, 10);
menghasilkan 1, bukan 1 000 000 000 000 000 000 000. Lagi pula, pertanyaannya secara eksplisit tidak ingin " mengkonversi ke string dan parsing ", meskipun itu relatif kecil ...;)parseInt()
mengharapkan string bukan angka sebagai parameter pertama. Ketika Anda melewati bilangan bulat ini, itu dikonversi ke1e21
dan kemudianparseInt
mem-parsing string1e21
, yang menghasilkan1
.Pergeseran bit sebesar 0 yang setara dengan pembagian dengan 1
sumber
>> 0
tampaknya hanya berfungsi untuk bilangan bulat < 2 ^ 31-1 , dan>>> 0
untuk bilangan bulat < 2 ^ 32-1 . Ini mengembalikan 0 untuk nilai yang lebih besarDalam kasus Anda, ketika Anda menginginkan sebuah string pada akhirnya (untuk memasukkan koma), Anda juga dapat menggunakan
Number.toFixed()
fungsi tersebut, namun ini akan melakukan pembulatan.sumber
Ada banyak saran di sini. Bitwise OR tampaknya menjadi yang paling sederhana sejauh ini. Berikut ini adalah solusi pendek lain yang berfungsi dengan angka negatif serta menggunakan operator modulo. Mungkin lebih mudah dipahami daripada bitwise ATAU:
Metode ini juga berfungsi dengan angka bernilai tinggi di mana '| 0' atau '~~' atau '>> 0' tidak berfungsi dengan benar:
sumber
Untuk memotong :
Untuk bulat :
sumber
Satu lagi cara yang mungkin - gunakan operasi XOR:
Prioritas operasi bitwise kurang dari prioritas operasi matematika, ini berguna. Coba di https://jsfiddle.net/au51uj3r/
sumber
Jika melihat ke
Math
objek asli dalam JavaScript, Anda mendapatkan sejumlah fungsi untuk bekerja pada angka dan nilai, dll ...Pada dasarnya apa yang ingin Anda lakukan cukup sederhana dan asli dalam JavaScript ...
Bayangkan Anda memiliki nomor di bawah ini:
dan sekarang jika Anda ingin membulatkannya ke nomor terdekat, cukup lakukan:
dan Anda mendapatkan:
Jika Anda ingin membulatkannya ke nomor terdekat, cukup lakukan:
dan Anda mendapatkan:
Juga
Math.round
hanya membulatkannya ke angka yang lebih tinggi atau lebih rendah tergantung mana yang lebih dekat dengan nomor flot.Anda juga dapat menggunakan
~~
nomor di belakang float, yang akan mengkonversi float menjadi bilangan bulat.Anda bisa menggunakannya seperti
~~myValue
...sumber
~~
karena jika jumlahnya lebih besar dari batas int 32, itu akan mengubah nilai ke nilai batas int 32.sumber
Saya hanya ingin menunjukkan bahwa Anda ingin membulatkan uang, dan tidak memotong. Kehilangan uang satu sen lebih kecil kemungkinannya, karena 4.999452 * 100 bulat akan memberi Anda 5, jawaban yang lebih representatif.
Dan di atas itu, jangan lupa tentang pembulatan bankir , yang merupakan cara untuk melawan bias yang sedikit positif yang diberikan pembulatan langsung - aplikasi keuangan Anda mungkin memerlukannya.
Pembulatan Gaussian / bankir dalam JavaScript
sumber
Jika Anda menggunakan angularjs maka solusi sederhana sebagai berikut Di Binding Template HTML
{{val | number:0}}
itu akan mengubah val menjadi integer
lanjutkan dengan tautan ini docs.angularjs.org/api/ng/filter/number
sumber