web-dev-qa-db-fra.com

Comment convertir un nombre flottant en nombre entier en JavaScript?

Je voudrais convertir un float à un nombre entier en JavaScript. En fait, j'aimerais savoir comment effectuer les deux conversions standard: en tronquant et en arrondissant. Et efficacement, pas via la conversion en chaîne et l'analyse syntaxique.

929
mcherm

Opérateur binaire OR

Un bitwise ou un opérateur peut être utilisé pour tronquer les nombres à virgule flottante et cela fonctionne aussi bien pour les positifs que pour les négatifs:

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

Résultats

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

Comparaison de performance?

J'ai créé un test JSPerf qui compare les performances entre:

  • Math.floor(val)
  • val | 0 bitwise OU
  • ~~val bitwise PAS
  • parseInt(val)

cela ne fonctionne qu'avec des nombres positifs. Dans ce cas, vous pouvez utiliser les opérations au niveau du bit en tant que fonction Math.floor.

Mais si vous avez besoin que votre code fonctionne avec les positifs et les négatifs , alors une opération au niveau des bits est la plus rapide (OU étant la méthode préférée). Cet autre test de JSPerf compare le même résultat où il est assez évident qu'en raison de la vérification supplémentaire du signe , Math est maintenant le plus lent du quatre.

Remarque

Comme indiqué dans les commentaires, les opérateurs BITWISE opèrent sur des entiers 32 bits signés; par conséquent, les grands nombres sont convertis, par exemple:

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

Remarque: vous ne pouvez pas utiliser Math.floor() en remplacement de truncate, car Math.floor(-3.1) = -4 et non -3 !!

Un remplacement correct pour tronquer serait:

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

    return Math.floor(value);
}
91
user189987

Un opérateur double bitwise not peut être utilisé pour tronquer les flottants. Les autres opérations que vous avez mentionnées sont disponibles via Math.floor , Math.ceil et Math.round .

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

Plus de détails avec la permission de James Padolsey.

42
brad

Pour tronquer:

var intvalue = Math.floor(value);

Pour tour:

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

Vous pouvez utiliser la méthode parseInt pour ne pas arrondir. Soyez prudent avec les entrées utilisateur en raison des options de préfixe 0x (hex) et 0 (octal).

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

Décalage de bits par 0, ce qui équivaut à une division par 1

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

Dans votre cas, lorsque vous souhaitez une chaîne à la fin (pour insérer des virgules), vous pouvez également utiliser simplement la fonction Number.toFixed (). Toutefois, cela arrondira.

7
Russell Leggett

Il y a beaucoup de suggestions ici. Le bitwise OR semble être de loin le plus simple. Voici une autre solution courte qui fonctionne avec les nombres négatifs en utilisant également l'opérateur modulo. Il est probablement plus facile à comprendre que le bitwise OU:

intval = floatval - floatval%1;

Cette méthode fonctionne également avec les nombres de valeur élevée où ni '| 0' ni '~~' ni '>> 0' ne fonctionnent correctement:

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

Une autre possibilité - utilisez l’opération XOR:

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

La priorité des opérations au niveau des bits est inférieure à la priorité des opérations mathématiques, c'est utile. Essayez sur https://jsfiddle.net/au51uj3r/

5
Dmitry Kharitonov

Pour tronquer:

// 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

Pour round:

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

Si vous utilisez angularjs, procédez comme suit: Dans la liaison de modèles HTML

{{val | number:0}} 

il va convertir val en entier

passer par ce lien docs.angularjs.org/api/ng/filter/number

0
Jameel Grand

Si vous recherchez un objet Math natif en JavaScript, vous obtenez l'ensemble des fonctions permettant de travailler sur les nombres et les valeurs, etc.

En gros, ce que vous voulez faire est assez simple et natif en JavaScript ...

Imaginez que vous avez le numéro ci-dessous:

const myValue = 56.4534931;

et maintenant, si vous voulez arrondir au nombre le plus proche, il suffit de faire:

const rounded = Math.floor(myValue);

et vous obtenez:

56

Si vous voulez arrondir au nombre le plus proche, faites simplement:

const roundedUp = Math.ceil(myValue);

et vous obtenez:

57

De plus, Math.round arrondit le chiffre au numéro le plus élevé ou le plus bas en fonction du nombre le plus proche du numéro de lot.

Aussi, vous pouvez utiliser ~~ derrière le nombre flottant, ce qui convertira un nombre flottant en nombre entier.

Vous pouvez l'utiliser comme ~~myValue...

0
Alireza

Je veux juste souligner que vous voulez arrondir mon argent, et non trunc. Il est beaucoup moins probable que vous gagniez un sou, car 4.999452 * 100 arrondis vous en donneront 5, une réponse plus représentative.

Et en plus, n'oubliez pas l'arrondi du banquier , qui est un moyen de contrer le biais légèrement positif que donne l'arrondi droit - votre application financière peut l'exiger.

Arrondi gaussien/bancaire en JavaScript

0
Gerard ONeill