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.
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.
Jawaban:
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue );
var intvalue = Math.round( floatvalue );
// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );
// value=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
Negatif
// value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
Positif - Angka yang lebih besar
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
Negatif - Angka yang lebih besar
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
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 diterima
2.3 - 2.3 % 1
Bitwise atau operator dapat digunakan untuk memotong angka floating point dan berfungsi untuk positif maupun negatif:
function float2int (value) {
return value | 0;
}
Hasil
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
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.
Sebagaimana dinyatakan dalam komentar, operator BITWISE beroperasi pada bilangan bulat 32bit yang ditandatangani, oleh karena itu sejumlah besar akan dikonversi, contoh:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
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 dengan 4
tetapi ~~4.2+4
sama8
Catatan: Anda tidak dapat menggunakan Math.floor()
sebagai pengganti truncate, karena Math.floor(-3.1) = -4
dan tidak -3
!!
Pengganti yang benar untuk truncate adalah:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
ditambahkan dalam ECMAScript 6
floor
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
, dan Math.round
.
> ~~2.5
2
> ~~(-1.4)
-1
<canvas>
di JS . Terima kasih!
Untuk memotong:
var intvalue = Math.floor(value);
Untuk putaran:
var intvalue = Math.round(value);
Anda bisa menggunakan metode parseInt tanpa pembulatan. Hati-hati dengan input pengguna karena awalan 0x (hex) dan 0 (oktal).
var intValue = parseInt(floatValue, 10);
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 ke 1e21
dan kemudian parseInt
mem-parsing string 1e21
, yang menghasilkan 1
.
Pergeseran bit sebesar 0 yang setara dengan pembagian dengan 1
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 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 besar
Dalam 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.
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:
intval = floatval - floatval%1;
Metode ini juga berfungsi dengan angka bernilai tinggi di mana '| 0' atau '~~' atau '>> 0' tidak berfungsi dengan benar:
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
Untuk memotong :
// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 ); // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
Untuk bulat :
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
Satu lagi cara yang mungkin - gunakan operasi XOR:
console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2
Prioritas operasi bitwise kurang dari prioritas operasi matematika, ini berguna. Coba di https://jsfiddle.net/au51uj3r/
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:
const myValue = 56.4534931;
dan sekarang jika Anda ingin membulatkannya ke nomor terdekat, cukup lakukan:
const rounded = Math.floor(myValue);
dan Anda mendapatkan:
56
Jika Anda ingin membulatkannya ke nomor terdekat, cukup lakukan:
const roundedUp = Math.ceil(myValue);
dan Anda mendapatkan:
57
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
...
~~
karena jika jumlahnya lebih besar dari batas int 32, itu akan mengubah nilai ke nilai batas int 32.
//Convert a float to integer
Math.floor(5.95)
//5
Math.ceil(5.95)
//6
Math.round(5.4)
//5
Math.round(5.5)
//6
Math.trunc(5.5)
//5
//Quick Ways
console.log(5.95| 0)
console.log(~~5.95)
console.log(5.95 >> 0)
//5
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.
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