2015-04-21 10 views

risposta

6

Una piccola lettura creativa della documentazione per parseInt() fornisce una risposta per questo. Ecco cosa sta succedendo:

  1. parseInt aspetta il suo primo argomento ad essere una stringa. Se non lo è, lo converte in una stringa. Questo è davvero divertente, perché sembra farlo ... avvolgendolo tra virgolette e passandolo attraverso .toString(), che è più o meno il contrario di parseInt() in questo caso. Nel tuo esempio, parseInt(123123123123123123123123); diventa parseInt("1.2312312312312312e+29").

  2. THEN prende il valore convertito in stringa e lo passa attraverso parseInt(). Come ci dice la documentazione, se incontra un carattere non numerico, si interrompe e va con quello che ha finora ... e tronca su un numero intero. Così si sta prendendo "1.2312312312312312e + 29", raggiungendo il +, interruzione, l'analisi "1,2312312312312312", invece, e venire con 1.

conseguenze indesiderate!

Vedrete solo questo problema con int sufficiente che una volta convertito in stringhe, rendono in notazione esponenziale di grandi dimensioni. Il problema di fondo è che anche se si potrebbe pensare che parseInt() e Number.toString() dovrebbe rispecchiare l'un l'altro ... non lo fanno, piuttosto, perché i valori int passati attraverso toString() in grado di generare le stringhe che parseInt() non capisce.

+0

@S McCrohan +1 Molto ben spiegato. – sachinjain024

2

In primo luogo, specificare sempre la radice (secondo parametro) per evitare indovinare.

In secondo luogo, parseInt si aspetta una stringa, in modo da aggiungere le virgolette attorno al numero.

parseInt("123123123123123123123123123123", 10) 
1.2312312312312312e+29 

Il riferimento per lo sviluppatore di Mozilla ha good documentation of this function ed esempi. Per quanto riguarda la radice, dicono:

Specificare sempre questo parametro per eliminare la confusione del lettore e garantire un comportamento prevedibile. Diverse implementazioni producono risultati diversi quando non viene specificata una radix.

Problemi correlati