Pertanyaan Mengapa parseInt (1/0, 19) menghasilkan 18?


Saya punya masalah yang menjengkelkan di JavaScript.

> parseInt(1 / 0, 19)
> 18

Kenapa parseInt kembali 18?


830
2017-07-05 08:37


asal


Jawaban:


Hasil dari 1/0 aku s Infinity.

parseInt memperlakukan argumen pertama sebagai string yang berarti pertama-tama Infinity.toString() disebut, menghasilkan string "Infinity". Jadi itu bekerja sama jika Anda memintanya untuk mengkonversi "Infinity" dalam basis 19 hingga desimal.

Berikut adalah digit dalam basis 19 bersama dengan nilai desimalnya:

Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18

Apa yang terjadi selanjutnya adalah itu parseInt memindai input "Infinity" untuk menemukan bagian mana yang dapat diurai dan berhenti setelah menerima yang pertama I (karena n bukan digit yang valid dalam basis 19).

Oleh karena itu berperilaku seolah-olah Anda dipanggil parseInt("I", 19), yang mengkonversi ke desimal 18 dengan tabel di atas.


1270
2017-07-05 08:41



Inilah urutan kejadian:

  • 1/0 mengevaluasi ke Infinity
  • parseInt dibaca Infinity dan dengan senang hati mencatat itu I adalah 18 dalam basis 19
  • parseInt mengabaikan sisa string, karena tidak dapat dikonversi.

Perhatikan bahwa Anda akan mendapatkan hasil untuk basis apa pun >= 19, tetapi tidak untuk pangkalan di bawahnya. Untuk basis >= 24, Anda akan mendapatkan hasil yang lebih besar, seperti n menjadi digit yang valid pada saat itu.


221
2017-07-05 08:43



Untuk menambah jawaban di atas:

parseInt dimaksudkan untuk mengurai string menjadi angka (petunjuknya ada di nama). Dalam situasi Anda, Anda tidak ingin melakukan parsing sama sekali sejak 1/0 adalah sudah sebuah angka, jadi itu adalah pilihan fungsi yang aneh. Jika Anda memiliki nomor (yang Anda lakukan) dan ingin mengubahnya menjadi basis tertentu, Anda harus menggunakan toString dengan radix sebagai gantinya.

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

34
2017-07-10 15:54



Untuk menambah jawaban di atas

parseInt(1/0,19) setara dengan parseInt("Infinity",19)

Dalam basis 19 angka 0-9 dan A-I  (or a-i) adalah angka yang valid. Jadi, dari "Infinity" yang dibutuhkan I dari basis 19 dan mengkonversi ke basis 10 yang menjadi 18 Kemudian ia mencoba untuk mengambil karakter selanjutnya yaitu n yang tidak ada dalam basis 19 sehingga membuang karakter berikutnya (seperti perilaku javascript mengubah string ke nomor)

Jadi, jika Anda menulis parseInt("Infinity",19) ATAU parseInt("I",19) ATAU parseInt("i",19) hasilnya akan sama yaitu 18.

Sekarang, jika Anda menulis parseInt("I0",19) hasilnya akan 342 sebagai I X 19 (the base)^1 + 0 X 19^0  = 18 X 19^1 + 0 X 19^0 = 18 X 19 + 0 X 1  = 342

Demikian pula, parseInt("I11",19) akan menghasilkan 6518

yaitu

  18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 361   +   1 X 19     +  1 X 1
= 6498  +  19  +  1
= 6518

11
2017-07-17 08:01