2014-12-25 9 views
5

Warum parseInt(1/10000000) Ergebnisse 1, wenn parseInt(1/1000000) Ergebnis ist 0?Funktion parseInt (1/10000000) gibt zurück 1. Warum?

Ich brauche ein Analog zu Java Int Casting wie int i = -1/10000000;, die 0 ist.

Sollte ich Math.floor für positive und Math.ceil für negative verwenden? Oder gibt es eine andere Lösung?

+0

Wie wäre es mit dem Parameter raddix? Es produziert das gleiche Ergebnis? –

+1

, weil 1/10000000 1e-7 zurückgibt, während 1/1000000 0.000001 zurückgibt. es unterscheidet sich wie parseInt tatsächlich funktioniert ... – FrEaKmAn

+1

@TimVermaelen dasselbe Ergebnis. –

Antwort

10

Zunächst scheint die Frage interessant. Dann schaute ich mir an, was 1/10000000 ist.

< 1/10000000 
> 1e-7 

Deshalb:

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

Wenn Sie auf eine ganze Zahl abschneiden möchten, können Sie dies tun:

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

Yeah und interessanterweise 'parseInt (1/1000001)' ist 9. :) – PSL

+1

Bit eines "inb4" -Kommentars hier, aber während 'return real >> 0;' würde funktionieren großartig auch, es ist auf 32-Bit-Zahlen beschränkt, während 'return real - (real% 1);' jeden float unterstützt. –

+0

Interessant ist auch, dass das erste, was 'parseInt' tut, 'toString' für das erste Argument ([spec]) ist (http://www.ecma-international.org/ecma-262/5.1/#sec-15.1 .2.2)), während 'parseFloat',' toFixed' und 'toPrecision' nicht funktionieren. – adeneo

6

ParseInt erwartet ein String-Argument zu analysieren, so wandelt sie in ein Zeichenfolge zuerst.

Wenn in eine Zeichenkette umgewandelt wird "0.000001", ignoriert parseInt dann alles von "." weiter, da es nur für Ganzzahlen ist, so dass es als 0 gelesen wird.

1/10000000 so klein ist, dass es in einem String Umwandlung verwendet wissenschaftliche Notation "1e-7", parseInt ignoriert dann alles von „e“ ab, da sie nur für ganze Zahlen sind, so liest er es als 1.

Grundsätzlich ist parseInt einfach nicht das, was Sie tun sollten.

Um eine Zahl auf eine ganze Zahl zu konvertieren, oder mit 0, da jede bitweise Operation in JavaScript, um die Nummer zu einem 32-Bit-int zwingt, und mit 0 ODER-Verknüpfung den Wert darüber hinaus, dass sie nicht ändert:

>(-1/10000000)|0 
0 

>1234.56|0 // truncation 
1234 

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

great @baonn ich habe heute etwas Neues gelernt –

+1

AFAIK, x | 0 ist auch ein Typhinweis für Ganzzahlen in asm.js. Nur eine lustige Tatsache. –