Pertanyaan Bagaimana cara mengonversi bilangan float ke bilangan bulat dalam JavaScript?


Saya ingin mengonversi pelampung menjadi angka utuh di JavaScript. Sebenarnya, saya ingin tahu bagaimana melakukan KEDUA dari konversi standar: dengan memotong dan dengan membulatkan. Dan efisien, tidak melalui konversi ke string dan parsing.


861
2018-02-27 20:15


asal


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 );

Referensi objek matematika


Contoh

Positif
value = 5.5

Math.floor(value) //  5
Math.ceil(value)  //  6
Math.round(value) //  6
Math.trunc(value) //  5
parseInt(value)   //  5
~~value           //  5
value | 0         //  5
value >> 0        //  5
value >>> 0       //  5
value - value % 1 //  5
Negatif
value = -5.5

Math.floor(value) // -6
Math.ceil(value)  // -5
Math.round(value) // -5
Math.trunc(value) // -5
parseInt(value)   // -5
value | 0         // -5
~~value           // -5
value >> 0        // -5
value >>> 0       // 4294967291
value - value % 1 // -5
Positif - Jumlah yang lebih besar
value = Number.MAX_SAFE_INTEGER/10 // 900719925474099.1

Math.floor(value) //  900719925474099
Math.ceil(value)  //  900719925474100
Math.round(value) //  900719925474099
Math.trunc(value) //  900719925474099
parseInt(value)   //  900719925474099
value | 0         //  858993459
~~value           //  858993459
value >> 0        //  858993459
value >>> 0       //  858993459
value - value % 1 //  900719925474099
Negatif - Jumlah yang lebih besar
value = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1

Math.floor(value) // -900719925474100
Math.ceil(value)  // -900719925474099
Math.round(value) // -900719925474099
Math.trunc(value) // -900719925474099
parseInt(value)   // -900719925474099
value | 0         // -858993459
~~value           // -858993459
value >> 0        // -858993459
value >>> 0       //  3435973837
value - value % 1 // -900719925474099

1183
2018-02-27 20:21



Operator Bitwise ATAU

Operator bitwise atau dapat digunakan untuk memotong angka titik mengambang dan berfungsi untuk hal positif serta negatif:

function float2int (value) {
    return value | 0;
}

Hasil

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

Perbandingan kinerja?

Saya telah membuat a Tes JSPerf yang membandingkan kinerja antara:

  • Math.floor(val)
  • val | 0  bitwise ATAU
  • ~~val  bitwise TIDAK
  • parseInt(val)

yang hanya berfungsi dengan angka positif. Dalam hal ini Anda aman untuk menggunakan operasi bitwise juga Math.floor fungsi.

Tetapi jika Anda membutuhkan kode Anda bekerja dengan positif dan juga negatif, maka operasi bitwise adalah yang tercepat (ATAU menjadi yang lebih disukai). Tes JSPerf lainnya ini membandingkan hal yang sama di mana cukup jelas bahwa karena pemeriksaan tanda tambahan 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:

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987

263
2017-10-11 10:18



Catatan: Anda tidak dapat menggunakan Math.floor() sebagai pengganti truncate, karena Math.floor(-3.1) = -4 dan tidak -3 !!

Penggantian truncat yang tepat adalah:

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}

88
2017-10-14 16:17



Ganda bitwise tidak operator dapat digunakan untuk memotong pelampung. Operasi lain yang Anda sebutkan tersedia melalui Math.floor, Math.ceil, dan Math.round.

> ~~2.5
2
> ~~(-1.4)
-1

Lebih detail milik James Padolsey.


40
2018-01-11 16:54



Untuk memotong:

var intvalue = Math.floor(value);

Untuk putaran:

var intvalue = Math.round(value);

36
2018-02-27 20:22



Anda dapat menggunakan parseInt metode tanpa pembulatan. Hati-hati dengan input pengguna karena opsi prefiks 0x (hex) dan 0 (oktal).

var intValue = parseInt(floatValue, 10);

22
2017-09-26 20:41



Sedikit bergeser sebesar 0 yang setara dengan pembagian dengan 1

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2

17
2017-07-25 07:33



Dalam kasus Anda, ketika Anda ingin string pada akhirnya (untuk memasukkan koma), Anda juga dapat menggunakan fungsi Number.toFixed (), namun, ini akan melakukan pembulatan.


7
2017-10-14 16:30



Ada banyak saran di sini. OR bitwise tampaknya menjadi yang paling sederhana sejauh ini. Berikut ini adalah solusi singkat yang bekerja dengan angka negatif serta menggunakan operator modulo. Ini mungkin lebih mudah dipahami daripada bitwise ATAU:

intval = floatval - floatval%1;

Metode ini juga berfungsi dengan angka nilai tinggi di mana baik '| 0' maupun '~~' atau '>> 0' berfungsi dengan benar:

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295

6
2017-07-11 13:42



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, itu berguna. Mencoba https://jsfiddle.net/au51uj3r/


4
2018-02-28 17:45