wake-up-neo.com

Wie konvertiere ich eine Float-Nummer in eine ganze Zahl in JavaScript?

Ich möchte einen Float in JavaScript in eine ganze Zahl konvertieren. Eigentlich würde ich gerne wissen, wie man beide Standardkonvertierungen durchführt: durch Abschneiden und durch Rundung. Und zwar effizient, nicht durch Konvertierung in einen String und Parsen.

929
mcherm

Bitweiser OR Operator

Ein bitweiser oder Operator kann zum Abschneiden von Gleitkommazahlen verwendet werden und funktioniert sowohl für Positive als auch für Negative:

function float2int (value) {
    return value | 0;
}

Ergebnisse

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

Leistungsvergleich?

Ich habe einen JSPerf-Test erstellt, der die Leistung vergleicht zwischen:

  • Math.floor(val)
  • val | 0 bitweises ODER
  • ~~val bitweise NICHT
  • parseInt(val)

das funktioniert nur mit positiven zahlen. In diesem Fall können Sie bitweise Operationen und die Funktion Math.floor verwenden.

Wenn Sie Ihren Code benötigen, um sowohl mit Positiven als auch mit Negativen zu arbeiten , ist eine bitweise Operation die schnellste (ODER die bevorzugte). Dieser andere JSPerf-Test vergleicht dasselbe, wobei es ziemlich offensichtlich ist, dass aufgrund der zusätzlichen Vorzeichenprüfung Mathematik jetzt die langsamste von allen ist vier.

Hinweis

Wie in den Kommentaren angegeben, arbeiten BITWISE-Operatoren mit vorzeichenbehafteten 32-Bit-Ganzzahlen. Daher werden große Zahlen konvertiert. Beispiel:

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987
286
Robert Koritnik

Hinweis: Sie können Math.floor() nicht als Ersatz für truncate verwenden, da Math.floor(-3.1) = -4 und nicht -3 !!

Ein korrekter Ersatz für das Abschneiden wäre:

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}
91
user189987

Ein doppelter bitweiser not - Operator kann zum Abschneiden von Floats verwendet werden. Die anderen von Ihnen erwähnten Operationen sind über Math.floor , Math.ceil und Math.round verfügbar.

> ~~2.5
2
> ~~(-1.4)
-1

Weitere Details mit freundlicher Genehmigung von James Padolsey.

42
brad

Für abschneiden:

var intvalue = Math.floor(value);

Für runde:

var intvalue = Math.round(value);
38
Mike

Sie können die Methode parseInt für keine Rundung verwenden. Seien Sie vorsichtig mit der Benutzereingabe aufgrund der Präfix-Optionen 0x (Hex) und 0 (Oktal).

var intValue = parseInt(floatValue, 10);
22
Graeme Wicksted

Bitverschiebung um 0, was einer Division durch 1 entspricht

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
17
Prasanth

In Ihrem Fall können Sie, wenn Sie einen String am Ende wünschen (um Kommas einzufügen), auch einfach die Number.toFixed () - Funktion verwenden, dies wird jedoch gerundet.

7
Russell Leggett

Hier gibt es viele Vorschläge. Das bitweise OR scheint bei weitem das einfachste zu sein. Hier ist eine weitere kurze Lösung, die mit dem Modulo-Operator auch mit negativen Zahlen arbeitet. Es ist wahrscheinlich einfacher zu verstehen als das bitweise ODER:

intval = floatval - floatval%1;

Diese Methode funktioniert auch mit hohen Zahlen, bei denen weder '| 0' noch '~~' noch '>> 0' richtig funktionieren:

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
6
Juliane Holzt

Eine weitere Möglichkeit - die Operation XOR verwenden:

console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2

Die Priorität von bitweisen Operationen ist weniger als die Priorität von mathematischen Operationen. Versuchen Sie es mit https://jsfiddle.net/au51uj3r/

5

Zu abschneiden:

// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 );  // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted

Bis runde:

Math.round( 1.5 );  // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
1
Razor

Wenn Sie anglejs verwenden, gehen Sie in HTML Template Binding .__ wie folgt vor.

{{val | number:0}} 

es wird val in eine ganze Zahl konvertieren

mit diesem Link durchgehen docs.angularjs.org/api/ng/filter/number

0
Jameel Grand

Wenn Sie in JavaScript das native Math-Objekt betrachten, erhalten Sie eine ganze Reihe von Funktionen, um mit Zahlen und Werten usw. zu arbeiten.

Grundsätzlich ist das, was Sie wollen, in JavaScript ziemlich einfach und nativ ...

Stellen Sie sich vor, Sie haben die folgende Nummer:

const myValue = 56.4534931;

und jetzt, wenn Sie es auf die nächste Nummer abrunden möchten, tun Sie einfach:

const rounded = Math.floor(myValue);

und du bekommst:

56

Wenn Sie es auf die nächste Nummer aufrunden möchten, machen Sie einfach:

const roundedUp = Math.ceil(myValue);

und du bekommst:

57

Auch Math.round nur auf eine höhere oder niedrigere Zahl runden, hängt davon ab, welcher der Flottummer näher ist.

Sie können auch ~~ hinter der Float-Nummer verwenden, um einen Float in eine ganze Zahl umzuwandeln.

Sie können es wie ~~myValue... verwenden.

0
Alireza

Ich möchte nur darauf hinweisen, dass Sie monetär abrunden und nicht abschneiden wollen. Es ist viel unwahrscheinlicher, dass Sie sich um einen Cent absetzen, da 4.999452 * 100 abgerundet 5 ergibt, eine repräsentativere Antwort.

Vergessen Sie außerdem nicht die Banker-Rundung . Dies ist ein Weg, um der leicht positiven Tendenz der geraden Rundung entgegenzuwirken.

Gaussian/banker rundung in JavaScript

0
Gerard ONeill