Frage Warum gibt parseInt (1/0, 19) 18 zurück?


Ich habe ein nerviges Problem in JavaScript.

> parseInt(1 / 0, 19)
> 18

Warum tut parseInt Rückkehr 18?


830
2017-07-05 08:37


Ursprung


Antworten:


Das Ergebnis von 1/0 ist Infinity.

parseInt behandelt sein erstes Argument als String, was zunächst bedeutet Infinity.toString() heißt, produziert die Zeichenfolge "Infinity". Es funktioniert also genauso, als ob Sie es umwandeln wollten "Infinity" in der Basis 19 bis dezimal.

Hier sind die Ziffern in der Basis 19 mit ihren Dezimalwerten:

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

Was als nächstes passiert ist das parseInt scannt die Eingabe "Infinity" um herauszufinden, welcher Teil davon analysiert werden kann, und nachdem der erste Teil akzeptiert wurde I (weil n ist keine gültige Ziffer in der Basis 19).

Deshalb verhält es sich so, als ob du angerufen hättest parseInt("I", 19), die durch die obige Tabelle in Dezimal 18 konvertiert wird.


1270
2017-07-05 08:41



Hier ist die Abfolge der Ereignisse:

  • 1/0 bewertet zu Infinity
  • parseInt liest Infinity und notiert das glücklich I ist 18 in der Basis 19
  • parseInt ignoriert den Rest der Zeichenfolge, da sie nicht konvertiert werden kann.

Beachten Sie, dass Sie ein Ergebnis für jede Basis erhalten würden >= 19, aber nicht für Basen darunter. Für Basen >= 24, Sie erhalten ein größeres Ergebnis, als n wird an diesem Punkt eine gültige Ziffer.


221
2017-07-05 08:43



Um zu den obigen Antworten hinzuzufügen:

parseInt soll Strings in Zahlen zerlegen (der Hinweis ist im Namen). In Ihrer Situation wollen Sie gar kein Parsing mehr machen, seit 1/0 ist bereits eine Nummer, also ist es eine seltsame Wahl der Funktion. Wenn du eine Nummer hast (was du tust) und sie in eine bestimmte Basis umwandeln willst, solltest du verwenden toString mit einem Radix stattdessen.

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

34
2017-07-10 15:54



Um zu den obigen Antworten hinzuzufügen

parseInt(1/0,19) ist äquivalent zu parseInt("Infinity",19)

Innerhalb der Basis 19 Zahlen 0-9 und A-I  (or a-i) sind gültige Zahlen. Also, von der "Infinity" dauert es I der Basis 19 und konvertiert zu Basis 10, die 18 wird Dann versucht es das nächste Zeichen zu nehmen, d.h. n was in der Basis 19 nicht vorhanden ist, verwirft also die nächsten Zeichen (gemäß dem JavaScript-Verhalten der Umwandlung von Zeichenketten in Zahlen)

Also, wenn du schreibst parseInt("Infinity",19) ODER parseInt("I",19) ODER parseInt("i",19) das Ergebnis wird das gleiche sein, d 18.

Jetzt, wenn du schreibst parseInt("I0",19) das Ergebnis wird sein 342 wie 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

Ähnlich, parseInt("I11",19) wird darin enden, dass 6518

d.h.

  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