Comment puis-je supprimer la partie décimale du numéro JavaScript?


218

J'ai les résultats d'une division et je souhaite supprimer la partie décimale du nombre résultant.

Comment puis-je faire ceci?

Réponses:


384

Vous pourriez utiliser ...

... en fonction de la façon dont vous souhaitez supprimer la décimale.

Math.trunc()n'est pas encore pris en charge sur toutes les plates-formes (à savoir IE), mais vous pouvez facilement utiliser un polyfill en attendant.

Une autre méthode pour tronquer la partie fractionnaire avec un excellent support de plate-forme consiste à utiliser un opérateur au niveau du bit (.eg |0). L'effet secondaire de l'utilisation d'un opérateur au niveau du bit sur un nombre est qu'il traitera son opérande comme un entier signé de 32 bits, supprimant ainsi la composante fractionnaire. Gardez à l'esprit que cela réduira également les nombres supérieurs à 32 bits.


Vous pouvez également parler de l'inexactitude de l'arrondi décimal avec l'arithmétique à virgule flottante.

Lecture obligatoire - Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante .


29
Gardez à l'esprit que Math.floor()cela augmentera la valeur numérique lorsque le nombre est négatif . Ainsi Math.floor(-1.2) -> -2tandis que Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( comme mentionné par @FloydPink ) supprimera la partie décimale comme prévu pour les nombres positifs et négatifs .
Paul T. Rawkeen

1
@ PaulT.Rawkeen Vous pouvez également utiliser un opérateur au niveau du bit pour supprimer la partie décimale, mais gardez à l'esprit qu'il tronque également à 32 bits.
alex

2
ce qui suit montre que cette réponse est instable:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake

4
@Jake Le résultat de 2.3*100en javascript est 229.99999999999997, il semble donc que l'opérateur au niveau du bit fasse correctement son travail dans votre exemple.
Chad von Nau

Existe-t-il une solution similaire à |0celle qui utilise des entiers 64 bits?
Clint

49

Vous pouvez également utiliser des opérateurs au niveau du bit pour tronquer la décimale.

par exemple

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Les opérations au niveau du bit sont considérablement plus efficaces que les fonctions mathématiques. L'opérateur double non au niveau du bit semble également légèrement surperformer les opérations x | 0et au niveau du x << 0bit d'une quantité négligeable.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Il convient également de noter que l'opérateur non au niveau du bit a priorité sur les opérations arithmétiques, vous devrez donc peut-être entourer les calculs de parenthèses pour obtenir le résultat souhaité:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Plus d'informations sur l'opérateur double pas au niveau du bit peuvent être trouvées sur Double bit au sens NON (~~)


2
Pourrait être légèrement efficace. Mais, je suggérerais des fonctions «mathématiques», car elles sont plus lisibles.
ashipj

Il y a des chances que cela ne fonctionne pas si l'entier n'est pas représenté comme des entiers signés 32 bits ( stackoverflow.com/a/7488075/3655192 )
Hiroki

30

Vous pourriez aussi faire

parseInt(a/b)

17
Notez que parseIntcela ne fonctionnera pas de manière fiable pour les grands nombres, car cela fonctionne en convertissant d'abord son argument en une chaîne, et pour les grands nombres, le résultat utilisera la notation exponentielle. Par exemple: var n = 22222222222222222222222; parseInt(n);reviendra 2, car n.toString()retourne 2.2222222222222223e+22.

2
Il n'utilise pas non plus parseInt()son objectif, qui est de prendre un nombre dans une chaîne et de renvoyer a Number.
alex

22

u peut également afficher un certain nombre de chiffres après le point décimal (ici 2 chiffres) en utilisant le code suivant:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
Sachez que toFixed () renvoie une chaîne, pas un nombre. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote

1
Comment est-ce une réponse en tant qu'OP demandant de supprimer la partie décimale
Isaac

3
Bien qu'il renvoie une chaîne, vous pouvez simplement utiliser la méthode Number () pour corriger cela. Number ((15.46974) .toFixed (2))
iPzard

13

Utilisez la Math.round()fonction.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
Pour être complet, il s'agit simplement de JavaScript, pas de requête.
Dave Newton

1
$.round = Math.round;)
alex


6

Avec ES2015 , Math.trunc () est disponible.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Il n'est pas pris en charge dans IE11 ou inférieur, mais fonctionne dans Edge et dans tous les autres navigateurs modernes.


2
Connaissez-vous des variations qui permettent de tronquer à X décimales? Serait-il naïf de penser que Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)cela fonctionnerait?
jamiebarrow

2
Hey Jamie, il semble que cela fonctionnerait dans la plupart des cas, mais il est sensible aux accrochages en virgule flottante. par exemple value = 2.3et x = 2reviendra 2.29. Je n'ai pas de meilleure suggestion.
Chad von Nau

Cela me semble être la bonne réponse. Aucun arrondi supérieur ou inférieur. Aucun problème avec les nombres négatifs. Jetez simplement la décimale. Comme la question demandée.
Tente Enrique Moreno

2

Si vous ne vous souciez pas du rouding, convertissez simplement le nombre en une chaîne, puis supprimez tout après la période, y compris la période. Cela fonctionne qu'il y ait une décimale ou non.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed se comportera comme rond.

Pour un comportement de type plancher, utilisez%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
Pourquoi pensez-vous que c'est mieux que d'utiliser Math.floor? Votre solution semble inutilement complexe et lente. Je ne sais pas comment Math.floor fonctionne, mais je m'attends à ce qu'il soit beaucoup plus optimisé. Aussi, je me demande si votre solution pourrait donner lieu à des erreurs d'arrondi à virgule flottante.
Hans Roerdinkholder

1

Voici le compressif dans l'explication détaillée à l'aide des messages ci-dessus:

1. Math.trunc (): il est utilisé pour supprimer les chiffres qui sont suivis d'un point. Il se transforme implicitement. Mais, non pris en charge dans IE.

Exemple:

Math.trunc (10.5) // 10

Math.trunc (-10,5) // -10

Autre manière alternative: utilisation de l'opérateur non au niveau du bit:

Exemple:

x = 5,5

~~ x // 5

2. Math.floor (): Il est utilisé pour donner la valeur entière minimum possible. Il est pris en charge dans tous les navigateurs.

Exemple:

Plancher mathématique (10,5) // 10

Plancher mathématique (-10,5) // -11

3. Math.ceil (): il est utilisé pour donner la valeur entière la plus élevée possible. Il est pris en charge dans tous les navigateurs.

Exemple:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round (): il est arrondi à l'entier le plus proche. Il est pris en charge dans tous les navigateurs.

Exemple:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11


0

Pour une implémentation ES6, utilisez quelque chose comme ceci:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

C'est pour ceux qui veulent empêcher les utilisateurs d'entrer des nombres décimaux

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>

0

Vous pouvez utiliser .toFixed (0) pour supprimer la partie décimale complète ou fournir le nombre d'arguments jusqu'à lequel vous voulez que la décimale soit tronquée.

Remarque: toFixed convertira le nombre en chaîne.


0

Par exemple:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

ou

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.