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.
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
J'ai créé un test JSPerf qui compare les performances entre:
Math.floor(val)
val | 0
bitwise OU~~val
bitwise PASparseInt(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.
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
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);
}
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
Pour tronquer:
var intvalue = Math.floor(value);
Pour tour:
var intvalue = Math.round(value);
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);
Décalage de bits par 0, ce qui équivaut à une division par 1
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
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.
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
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/
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
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
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
...
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.