2014-12-25 38 views
5

Dlaczego parseInt(1/10000000) wyniki 1, kiedy parseInt(1/1000000) wynik to 0?Funkcja parseInt (1/10000000) zwraca 1. Dlaczego?

Potrzebuję trochę analogowego do odlewania int Java, jak int i = -1/10000000;, który jest 0.

Czy należy używać wartości Math.floor dla pozytywnej i Math.ceil dla wartości ujemnej? Czy istnieje inne rozwiązanie?

+0

Co z parametrem raddix? Daje taki sam wynik? –

+1

ponieważ 1/10000000 zwraca 1e-7, a 1/1000000 zwraca 0.000001. różni się tym, że parseInt faktycznie działa ... – FrEaKmAn

+1

@TimVermaelen ten sam wynik. –

Odpowiedz

10

Na początku pytanie wydaje się interesujące. Potem przyjrzałem się, co to jest 1/10000000.

< 1/10000000 
> 1e-7 

Dlatego:

< parseInt("1e-7"); // note `parseInt` takes a STRING argument 
> 1 

Jeśli chcesz obciąć do liczby całkowitej, można to zrobić:

function truncateToInteger(real) { 
    return real - (real % 1); 
} 
+5

Tak, i bardziej interesująco 'parseInt (1/1000001)' ma 9. :) – PSL

+1

Bit komentarza "inb4" tutaj, ale podczas gdy 'return real >> 0;' działałby również super, jest ograniczony do liczb 32-bitowych, podczas gdy 'return real - (real% 1);' obsługuje dowolne zmienne. –

+0

Co ciekawe, pierwszą rzeczą jaką robi 'parseInt' jest wywołanie' toString' na pierwszym argumencie ([spec] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.1 .2.2)), podczas gdy 'parseFloat',' toFixed' oraz 'toPrecision' nie. – adeneo

6

parseInt zamierza przeanalizować argument ciąg, więc konwertuje go do ciąg pierwszy.

1/1000000 po przekonwertowaniu na ciąg znaków jest "0.000001", parseInt następnie ignoruje wszystko od "." dalej, ponieważ jest to tylko dla liczb całkowitych, więc brzmi to jako 0.

1/10000000 jest tak mała, że ​​przekształcenie go na ciąg używa notacji naukowej "1e-7", parseInt następnie ignoruje wszystko z „e” roku, ponieważ jest to tylko dla liczb całkowitych, więc czyta go jako 1.

Zasadniczo parseInt nie jest po prostu tym, co powinieneś robić.

Aby przekonwertować liczbę do liczby całkowitej, lub 0, ponieważ każda operacja bitowe w JavaScript zmusza liczbę do 32-bitowego int i Oring z 0 nie zmienia wartości ponad to:

>(-1/10000000)|0 
0 

>1234.56|0 // truncation 
1234 

>(2147483647+1)|0 // integer overflow 
-2147483648 
+0

świetna @baonn nauczyłem się czegoś nowego dzisiaj –

+1

AFAIK, x | 0 to także wskazówka dla liczb całkowitych w asm.js. Tylko zabawny fakt. –

Powiązane problemy