Bagaimana menemukan nomor itu float
atau integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
javascript
types
numbers
coure2011
sumber
sumber
<nit-pick>
JavaScript tidak memiliki tipe bilangan bulat dan float yang berbeda. Setiap angka dalam JavaScript hanya aNumber
.</nit-pick>
Infinity
nilai integer atau non-integer sejauh yang Anda perhatikan? Jawaban di sini cukup merata pada skor ini.Infinity
tidak dapat dianggap sebagai bilangan bulat.Jawaban:
periksa sisa ketika membaginya dengan 1:
Jika Anda tidak tahu bahwa argumennya adalah angka, Anda perlu dua tes:
Pembaruan 2019 5 tahun setelah jawaban ini ditulis, sebuah solusi distandarisasi dalam ECMA Script 2015. Solusi itu tercakup dalam jawaban ini .
sumber
true
,false
,null
, array kosong, array yang berisi satu nomor integral, array yang berisi string yang mewakili jumlah integral, dan mungkin lebih.""
dan1.0
isInt("");
&&isInt(1.0);
keduanya menghasilkantrue
lihat demo ini jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
, apakah itu "salah" atau "Jawaban terburuk pada SO" karena tidak memeriksa apakah argumennya adalah array terlebih dahulu? Ya, praktik yang baik untuk memeriksa argumen, tapi itu tanggung jawab pengembang. SO jawaban harus pendek dan langsung menjawab pertanyaan sejelas mungkin.Coba fungsi-fungsi ini untuk menguji apakah suatu nilai merupakan angka primitif angka yang tidak memiliki bagian fraksional dan berada dalam batas ukuran dari apa yang dapat direpresentasikan sebagai integer yang tepat.
sumber
n===+n
untuk mengecek angka,n|0
untuk keliling), tapi dengan operator bawaan. funkyparseFloat()
dulu.|
(OR) hanya beroperasi pada bilangan bulat 32-bit yang sudah ditandatangani. OP tidak menyatakan apakah tujuannya untuk memeriksa nilai int32 yang sudah ditandatangani. Jadi ini tidak akan berfungsi dengan angka di luar kisaran.isInteger(5000000000)
akan kembalifalse
yang salah!Kenapa tidak seperti ini:
sumber
n
dikonversi ke string olehparseInt
. Lihat MDN . Tetapi saya akan menggunakan solusi ini. :)Ada metode yang disebut
Number.isInteger()
yang saat ini diimplementasikan dalam segala hal kecuali IE. MDN juga menyediakan polyfill untuk browser lain:Namun, untuk sebagian besar kasus penggunaan, Anda lebih baik menggunakan
Number.isSafeInteger
yang juga memeriksa apakah nilainya sangat tinggi / rendah sehingga tempat desimal akan hilang pula. MDN memiliki polyfil untuk ini juga. (Anda juga memerlukanisInteger
pollyfill di atas.)sumber
12.0 ∈ ℤ
.Number.isInteger
. Namun, ini adalah polyfill yang benar untukNumber.isSafeInteger
.Number.isInteger
sebaiknya tidak memeriksa apakah nomor tersebut adalah "integer aman". Lihat di MDN: isInteger dan isSafeInteger .Anda dapat menggunakan ekspresi reguler sederhana:
Atau Anda dapat menggunakan fungsi di bawah ini juga, sesuai dengan kebutuhan Anda. Mereka dikembangkan oleh Proyek PHPJS .
is_int()
=> Periksa apakah tipe variabel bilangan bulat dan apakah isinya bilangan bulatis_float()
=> Periksa apakah tipe variabel float dan apakah isinya floatctype_digit()
=> Periksa apakah tipe variabel adalah string dan jika kontennya hanya memiliki angka desimalPerbarui 1
Sekarang ia memeriksa angka negatif juga, terima kasih atas komentar @ChrisBartley !
sumber
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
Berikut adalah fungsi-fungsi efisien yang memeriksa apakah nilainya angka atau dapat dikonversi dengan aman ke angka:
Dan untuk bilangan bulat (akan mengembalikan false jika nilainya float):
Efisiensi di sini adalah parseInt (atau parseNumber) dihindari ketika nilainya sudah berupa angka. Kedua fungsi parsing selalu mengkonversi ke string terlebih dahulu dan kemudian mencoba untuk mengurai string itu, yang akan sia-sia jika nilainya sudah berupa angka.
Terima kasih untuk posting lain di sini untuk memberikan ide lebih lanjut untuk optimasi!
sumber
sumber
1.2
. Selalu uji fungsi numerik dengan 0,1 0,2 0,3berfungsi untuk semua kasus.
sumber
isInt('1')
kembalitrue
seperti yang diharapkan (setidaknya untuk saya). Cukup aneh, meskipun, ini kembalitrue
keisInt([5])
juga. Tidak masalah bagi saya, tetapi mungkin bagi Anda, jadi berhati-hatilah.Seperti yang disebutkan lainnya, Anda hanya memiliki ganda di JS. Jadi, bagaimana Anda mendefinisikan angka menjadi bilangan bulat? Cukup periksa apakah angka yang dibulatkan sama dengan dirinya sendiri:
sumber
isFloat('abc')
pengembaliantrue
isFloat(NaN) // true
Bagaimana dengan yang ini?
sumber
console.log(isFloat(1.0));
hasil yang salah.Inilah yang saya gunakan untuk bilangan bulat:
Pendek, bagus :) Berfungsi sepanjang waktu. Inilah yang disarankan David Flanagan jika saya tidak salah.
sumber
parseFloat
?Itu sangat tergantung pada apa yang ingin Anda capai. Jika Anda ingin "meniru" bahasa yang sangat diketik maka saya sarankan Anda untuk tidak mencoba. Seperti yang lain disebutkan semua angka memiliki representasi yang sama (tipe yang sama).
Menggunakan sesuatu seperti Claudiu disediakan:
isInteger( 1.0 )
-> benaryang terlihat bagus untuk akal sehat, tetapi dalam sesuatu seperti C Anda akan dapatkan
false
sumber
Setiap angka Float dengan bagian desimal nol (mis. 1.0, 12.00, 0.0) secara implisit dilemparkan ke Integer, jadi tidak mungkin untuk memeriksa apakah angka itu Float atau tidak.
sumber
sumber
!!(24.0%1)
tidak benarItu benar-benar tidak harus terlalu rumit. Nilai numerik dari ekuivalen parseFloat () dan parseInt () akan sama. Dengan demikian Anda dapat melakukannya seperti ini:
Kemudian
Ini juga akan memungkinkan untuk pemeriksaan string dan karenanya tidak ketat. Jika ingin solusi tipe yang kuat (alias, tidak akan bekerja dengan string):
sumber
Belum ada kasus di mana ini tidak berhasil.
sumber
2
merupakan bilangan bulat dan23
dianggap sebagai argumen kedua untuk fungsi tersebut. Dalam desimal javascript ditulis menggunakan titik sebagai pemisah - jadi seharusnya2.23
.INI ADALAH KODE FINAL UNTUK MEMERIKSA KEDUA INT DAN FLOAT
ATAU
sumber
sumber
Sederhana seperti:
Coba ini di konsol:
Ini membingungkan banyak orang. Kapan pun ada sesuatu .0, itu bukan pelampung lagi. Itu bilangan bulat. Atau Anda bisa menyebutnya "hal numerik" karena tidak ada perbedaan yang ketat seperti dulu di C. Masa lalu yang baik.
Jadi pada dasarnya, yang dapat Anda lakukan adalah memeriksa bilangan bulat menerima kenyataan bahwa 1.000 adalah bilangan bulat.
Catatan pinggir yang menarik
Ada komentar tentang jumlah besar. Angka besar berarti TIDAK masalah untuk pendekatan ini; setiap kali parseInt tidak dapat menangani angka (karena terlalu besar) itu akan mengembalikan sesuatu yang lain dari nilai aktual sehingga tes akan mengembalikan SALAH. Ini adalah hal yang baik karena jika Anda menganggap sesuatu sebagai "angka", Anda biasanya mengharapkan JS untuk dapat menghitungnya - jadi ya, jumlahnya terbatas dan parseInt akan mempertimbangkan ini , dengan kata lain.
Coba ini:
Di browser saya (IE8) ini mengembalikan "a is ok; b gagal" yang persis karena jumlah besar di b. Batasnya mungkin bervariasi tetapi saya kira 20 digit "seharusnya cukup untuk siapa saja", mengutip klasik :)
sumber
Number.isInteger
.Number.isInteger
kerjanya. Tes satu barisn === (n | 0)
seperti yang ditunjukkan pada jawaban lain.Solusi ini berhasil untuk saya.
sumber
Untuk bilangan bulat saya menggunakan ini
sumber
Dalam skrip java semua angka
internally 64 bit floating point
sama dengan ganda di java. Tidak ada tipe berbeda dalam javascript, semua diwakili oleh tipenumber
. Karenanya kamu tidak akan bisa melakukaninstanceof
cek. Namun Anda dapat menggunakan solusi di atas yang diberikan untuk mencari tahu apakah itu angka pecahan. perancang skrip java merasa dengan satu tipe mereka dapat menghindari berbagai jenis kesalahan cor.sumber
Beberapa kali Objek angka tidak memungkinkan Anda untuk menggunakan langsung operator mod (%), jika Anda menghadapi kasing itu, Anda dapat menggunakan solusi ini.
sumber
Mencoba beberapa jawaban di sini saya akhirnya menulis solusi ini. Ini juga berfungsi dengan angka di dalam string.
sumber
Ini mungkin tidak sebagus% jawaban, yang mencegah Anda dari harus mengonversi ke string terlebih dahulu, tetapi saya belum melihat orang mempostingnya, jadi inilah opsi lain yang seharusnya berfungsi:
sumber
Bagi mereka yang penasaran, menggunakan Benchmark.js Saya menguji jawaban yang paling banyak dipilih (dan yang diposting hari ini) pada posting ini, berikut adalah hasil saya:
sumber
Ini kode saya. Ia memeriksa untuk memastikan itu bukan string kosong (yang jika tidak akan lulus) dan kemudian mengubahnya menjadi format numerik. Sekarang, tergantung pada apakah Anda ingin '1,1' sama dengan 1,1, ini mungkin atau tidak yang Anda cari.
sumber
Saya suka fungsi kecil ini, yang akan mengembalikan true untuk bilangan bulat positif dan negatif:
Ini berfungsi karena 1 atau "1" menjadi "1.0", yang isNaN () mengembalikan false on (yang kemudian kita negasikan dan kembali), tetapi 1.0 atau "1.0" menjadi "1.0.0", sedangkan "string" menjadi "string. 0 ", keduanya bukan angka, jadi isNaN () mengembalikan false (dan, sekali lagi, dinegasikan).
Jika Anda hanya ingin bilangan bulat positif, ada varian ini:
atau, untuk bilangan bulat negatif:
isPositiveInt () bekerja dengan menggerakkan string numerik mendahului nilai yang akan diuji. Sebagai contoh, isPositiveInt (1) menghasilkan isNaN () mengevaluasi "01", yang mengevaluasi false. Sementara itu, isPositiveInt (-1) menghasilkan isNaN () mengevaluasi "0-1", yang mengevaluasi true. Kami meniadakan nilai kembali dan itu memberi kami apa yang kami inginkan. isNegativeInt () bekerja dengan cara yang sama, tetapi tanpa meniadakan nilai kembali isNaN ().
Edit:
Implementasi asli saya juga akan mengembalikan true pada array dan string kosong. Implementasi ini tidak memiliki cacat itu. Ini juga memiliki keuntungan untuk kembali lebih awal jika val bukan string atau angka, atau jika string kosong, membuatnya lebih cepat dalam kasus ini. Anda dapat memodifikasinya lebih lanjut dengan mengganti dua klausa pertama dengan
jika Anda hanya ingin mencocokkan angka literal (dan bukan string)
Edit:
Saya belum dapat memposting komentar, jadi saya menambahkan ini ke jawaban saya. Patokan yang diposting oleh @ Asok sangat informatif; Namun, fungsi tercepat tidak sesuai dengan persyaratan, karena ia juga mengembalikan TRUE untuk float, array, booleans, dan string kosong.
Saya membuat suite tes berikut untuk menguji setiap fungsi, menambahkan jawaban saya ke daftar, juga (fungsi 8, yang mem-parsing string, dan fungsi 9, yang tidak):
Saya juga memutar ulang patokan dengan fungsi # 8 ditambahkan ke daftar. Saya tidak akan memposting hasilnya, karena agak memalukan (mis. Fungsi itu TIDAK cepat) ...
Hasil (singkat - saya menghapus tes yang sukses, karena hasilnya cukup panjang) adalah sebagai berikut:
Saya telah meninggalkan kegagalan sehingga Anda dapat melihat di mana setiap fungsi gagal, dan (string) '#' menguji sehingga Anda dapat melihat bagaimana setiap fungsi menangani nilai integer dan float dalam string, karena beberapa mungkin ingin ini diuraikan sebagai angka dan beberapa mungkin tidak.
Dari 10 fungsi yang diuji, yang benar-benar sesuai dengan persyaratan OP adalah [1,3,5,6,8,9]
sumber
Ketentuan untuk validasi mengambang:
Condtion for Integer validation:
Semoga ini bisa membantu.
sumber
Anda dapat menambahkan
typeof a === 'number'
jika Anda ingin mengecualikan string.sumber