JavaScript'te can sıkıcı bir sorunum var .
> parseInt(1 / 0, 19)
> 18
parseInt
İşlev neden geri dönüyor 18
?
JavaScript'te can sıkıcı bir sorunum var .
> parseInt(1 / 0, 19)
> 18
parseInt
İşlev neden geri dönüyor 18
?
Yanıtlar:
Sonucu 1/0
DİR Infinity
.
parseInt
ilk argümanını bir dize olarak ele alır, bu da her şeyden Infinity.toString()
önce dize üretilerek çağrılır "Infinity"
. Yani, "Infinity"
19 tabanındaki ondalık sayıya dönüştürmesini istediğiniz gibi çalışır .
İşte taban 19'daki ondalık değerlerle birlikte rakamlar:
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
Daha sonra ne olacağı parseInt
, girdinin taranması için "Infinity"
hangi kısmın ayrıştırılabileceğini bulmak ve ilkini kabul ettikten sonra durmasıdır I
(çünkü n
19 numaralı tabandaki geçerli bir rakam değildir).
Bu nedenle parseInt("I", 19)
, yukarıdaki tablo ile ondalık 18'e dönüştürülen aradığınız gibi davranır .
parseInt('Infini',24)
.
n
de geçerli bir basamak var, bu yüzden aslında bitiyor parseInt("Infini", 24)
.
Olayların sırası şöyledir:
1/0
için değerlendirir Infinity
parseInt
temel 19'da 18 Infinity
olduğunu okur ve mutlulukla not ederI
parseInt
dönüştürülemediğinden dizenin kalanını yoksayar.Herhangi bir baz için bir sonuç alacağınızı >= 19
, ancak bunun altındaki bazlar için elde edemeyeceğinizi unutmayın. Bazlar için >= 24
, n
o noktada geçerli bir basamak haline geldikçe daha büyük bir sonuç elde edersiniz .
parseInt
İngiliz alfabesinde 26 harf olduğu için kabul edilecek en büyük taban 36'dır ve kural verilen tabanda geçerli rakamlar kümesi olarak rakamları ve ardından harfleri kullanmaktır.
Infinity
için "Infinity"
...
Yukarıdaki cevaplara eklemek için:
parseInt dizeleri sayılara ayrıştırmayı amaçlamaktadır (ipucu adındadır). Durumunuzda, 1/0 zaten bir sayı olduğu için hiç ayrıştırma yapmak istemezsiniz , bu yüzden garip bir işlev seçimi. Bir numaranız varsa (bunu yaparsınız) ve bunu belirli bir tabana dönüştürmek istiyorsanız, bunun yerine bir radix ile toString kullanmalısınız.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Yukarıdaki cevaplara eklemek için
parseInt(1/0,19)
eşittir parseInt("Infinity",19)
Temel sayı 19 içinde 0-9
ve A-I
(or a-i)
geçerli bir sayıdır. Yani, "Sonsuzluk" dan onu alır I
tabanın 19 ve Sonra 18 olur 10 tabanına dönüştürür sonraki karakteri yani almaya çalışır n
sayıya dize dönüştürme javascript davranışları gereğince (19 öylesine silip mevcut sonraki karakterler baz bulunmaz )
Yani, parseInt("Infinity",19)
VEYA parseInt("I",19)
VEYA yazarsanız parseInt("i",19)
, sonuç aynı olacaktır 18
.
Yazdığınız Şimdi, eğer parseInt("I0",19)
sonuç olacak 342
şekilde 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
Benzer şekilde, parseInt("I11",19)
sonuçlanacaktır6518
yani
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
if
yardımcı olabilir.