2015-03-17 19 views
5

Grałem z JS i zauważyłem to.parseInt() notacja naukowa

Dlaczego parseInt(1e+21) zwraca 1 i parseInt(1e+20) wróć 100000000000000000000? parseInt(10e+20) również zwraca 1?

Dlaczego zwraca NaN podczas gdy parseFloat(1.7976931348623157E+10308) zwraca Infinity?


Nawet wykonana sekwencja Fibonacci i dowolną wartość, która ma +21 wykładniki zwraca tylko pierwszą cyfrę:

fibonacci sequence scientific notation

parseFloat() powróci prawidłowy numer do nieskończoności.

Fibonacci demo (int : parseInt() : parseFloat())

(przetestowane w Chrome)

Odpowiedz

3

parseInt i parseFloat mają analizować ciągi i konwertować je do Number s. Tak więc, kiedy przekazujesz im Number, zostaje on przymuszony do napisu przez tłumacza. Tak więc, przynajmniej w Firefox, "" + 1e+20 wyjściami "100000000000000000000" i "" + 1e+21 wyjściami "1e+21".

Przeczytajmy the documentation z parseInt:

Jeśli parseInt napotka znak, który nie jest cyfrą w podanej radix, ignoruje go i wszystkie znaki kolejne, i zwraca wartość całkowitą przetworzoną do tej pory

więc parseInt("1.whatever") powraca 1 i parseInt("32.231e+something") powraca 32.

podobna sprawa musi być happeni ng z parseFloat.

To słaba wina maszynowa. IMO prawidłowe zachowanie, gdy robisz to, co robisz, byłoby rzucić wyjątek.

+0

Dlaczego parseInt (1e + 20) zwraca 100000000000000000000, a nie 1, to? – rottenoats

+0

Już to powiedziałem. Kiedy '1e + 20' zostaje wymuszone na łańcuch, wypisuje' '100000000000000000000" ', który zostanie przeanalizowany na poprawną liczbę. '1e + 21' wyświetla' '1e + 21" 'zamiast tego. Wypróbuj "" + sum, które napisałem w odpowiedzi. – rhaps0dy

+0

Zrobiłem. parseInt ("" + 1e + 21) wyprowadza 1 – rottenoats