2015-04-06 18 views
8

Diese Frage ist einfach Neugier.Warum das stimmt: parseInt (1111111111111111,2) === parseInt (11111111111111111,2)

Via Konsole

parseInt(1111111111111111,2) // 16 1's 

kehrt

65535 

und

parseInt(11111111111111111,2) // 17 1's 

kehrt

65535 

Auch

//   16 1's       17 1's 
if(parseInt(1111111111111111,2) === parseInt(11111111111111111,2)) 

kehrt

true 

Wo ist der Trick?

Dank

+3

Tipp: Versuchen Sie einfach '11111111111111111'. – SLaks

+0

Das erste Argument für 'parseInt' ** muss ** eine Zeichenfolge sein. Es ist GIGO. – zerkms

+2

'(1111111111111111) .toString() ===" 1111111111111111 "' und '(11111111111111111) .toString() ===" 11111111111111112 "'. 'parseInt' erwartet eine Zeichenkette und' 2' ist eine ungültige Binärziffer. –

Antwort

8

11111111111111111 ist eine Dezimalzahl wörtliche für eine Zahl, die zu groß ist für Javascript genau zu kodieren.

parseInt(, 2) stoppt bei dem ersten Zeichen, das nicht 1 oder 0 ist, so hört es auf zu analysieren, sobald die Genauigkeit abnimmt.

Ändern Sie das zu einer Zeichenfolge und alles wird gut.

+0

Sind Sie sicher? Ich dachte, dass JavaScript 64-Bit-Ganzzahlen verwendet? –

+1

@self: Nein; Es verwendet 64-Bit-_floats_. Es gibt einen wichtigen Unterschied. – SLaks

+3

@ william.taylor.09 java! ================= Javascript – zerkms

Verwandte Themen