2012-03-02 19 views
8

Dlaczego ta różnica w zachowaniu między parseInt() i parseFloat()?Różnica w zachowaniu między parseInt() i parseFloat()

Mam ciąg znaków, który zawiera w sobie 08.

Kiedy piszę ten kod:

alert(hfrom[0]); 
alert(parseInt(hfrom[0])); 
alert(parseFloat(hfrom[0])); 

Poniższy wyjściowy jest generowany:

08 
0 
8 

Dlaczego parseInt i parseFloat powrót dwa różne wyniki w tym przypadku?

+1

sprawdzić ten SO postu: http://stackoverflow.com/questions/6900857/alertparseint09-shows-me-0-why Jest tak dlatego, że parseInt przyjmuje, że 08 ma być przetwarzany jako baza ośmiokrotna, ponieważ zaczyna się od 0 – Chandu

+0

Działając na jsfilddle w chrome otrzymuję '8' dla obu funkcji: http://jsfiddle.net/ nqNvw/ – gideon

+2

@gideon, to dlatego, że przekazałeś liczby, które zostały już przekonwertowane na liczby całkowite z base-10. Jeśli przekazujesz * ciągi *, zachowuje się inaczej. Zobacz: http://jsfiddle.net/nqNvw/1/ (to zdecydowanie rzecz typu wtfjs) –

Odpowiedz

10

parseInt() zakłada podstawę numeru zgodnie z pierwszymi znakami w łańcuchu. Jeśli zaczyna się od 0x, przyjmuje bazę 16 (szesnastkową). W przeciwnym razie, jeśli zaczyna się od 0, przyjmuje podstawę 8 (ósemkową). W przeciwnym wypadku zakłada bazowej 10.

można określić zasadę jako drugi argument:

alert(parseInt(hfrom[0], 10)); // 8 

Od MDN (powiązany powyżej):

Jeśli podstawa jest niezdefiniowany lub 0, JavaScript przyjmuje następujące:

Jeśli ciąg wejściowy rozpoczyna się od "0x" lub "0X", podstawa to 16 (szesnastkowa). Jeśli ciąg wejściowy zaczyna się od "0", podstawa wynosi osiem (ósemkowa). Ta funkcja jest niestandardowa, a niektóre implementacje celowo jej nie obsługują (zamiast tego używają podstawy 10). Dla tego powodu zawsze podaj podstawkę, gdy używasz parseInt. Jeśli ciąg wejściowy rozpoczyna się od dowolnej innej wartości, podstawa wynosi 10 (dziesiętnie).

+0

Zobacz także sekcję ** Examples ** na tej stronie. – Paulpro

2

należy zawsze zawierać param radix z parseInt() ex parseInt('013', 10) inaczej może konwertować je do innej bazy numerycznej:

parseInt('013') === 11 
parseInt('013', 10) === 13 
parseInt('0x13') === 19 
Powiązane problemy