ParseInt (1/0, 19) neden 18 döndürüyor?


853

JavaScript'te can sıkıcı bir sorunum var .

> parseInt(1 / 0, 19)
> 18

parseIntİşlev neden geri dönüyor 18?


3
İlginç. Peki bu sizin için neden sinir bozucu bir problem? Infinity'yi başka şekillerde ele almanız gerekiyor mu? Eğer öyleyse, bir ifyardımcı olabilir.
Thilo

254
Bunu bile ne yapıyordunuz ya baz-19 sayıları VEYA sıfıra bölme ile çalışmanızı gerektiriyordu !?
Jack M

19
JS hakkında kafanız karıştığında, bu alıntıya geri dönün ve tüm lanet dilin 10 günden daha kısa bir sürede tasarlandığını ve uygulandığını unutmayın (bunu yapan kişiye göre).
tylerl

32
SSS bölümünden: "Yalnızca karşılaştığınız gerçek sorunlara dayanarak pratik ve cevaplanabilir sorular sormalısınız." Bu aslında karşılaştığınız "sinir bozucu bir sorun" değil, sonsuza dek internette yüzen gerçekçi olmayan bir örnek .
Jeremy Banks

2
python aynı şeyi yapar: int ('I', 19) == 18
oberhamsi

Yanıtlar:


1292

Sonucu 1/0DİR Infinity.

parseIntilk 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ü n19 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 .


32
@mithunsatheesh Deneyin parseInt('Infini',24).
Supr

112
@mithunsatheesh: Çünkü taban 24'te nde geçerli bir basamak var, bu yüzden aslında bitiyor parseInt("Infini", 24).
Jon

36
Birisi neden böyle davranan bir dilde 'programlamak' istiyor?
Frans Bouma

45
@FransBouma: JS kendi yolunda güzel. Ve gerçekten, burada olanların hiçbir kısmı dinamik bir dilde mantıksız değil.
Jon

59
@Jon: Bu eser dinamik dilin sonucu değil; bu gevşek yazmanın bir sonucudur. Kesin olarak yazılan dinamik dilde, bu tür bir sersemliği önlemek için Infinity'nin (float) "Infinity" (dize) 'ye örtülü dönüşümü olmazdı.
Lie Ryan

225

Olayların sırası şöyledir:

  • 1/0 için değerlendirir Infinity
  • parseInttemel 19'da 18 Infinityolduğ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, no noktada geçerli bir basamak haline geldikçe daha büyük bir sonuç elde edersiniz .


O yüzden @Thilo BTW, ne sebep olurdu belki üssün büyük olursa, 19 görülmüyor? Biliyor musunuz, JS'nin iterpret yapabileceği en büyük taban nedir?
Arnthor

4
@Nordvind 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.
Craig Citro

4
Mermi noktası 2. günü, değişen önerebilir Infinityiçin "Infinity"...
CJBS

38

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"

13

Yukarıdaki cevaplara eklemek için

parseInt(1/0,19) eşittir parseInt("Infinity",19)

Temel sayı 19 içinde 0-9ve A-I (or a-i)geçerli bir sayıdır. Yani, "Sonsuzluk" dan onu alır Itabanın 19 ve Sonra 18 olur 10 tabanına dönüştürür sonraki karakteri yani almaya çalışır nsayı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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.