354 votes

Obtenir la partie décimale d'un nombre avec JavaScript

J'ai des nombres flottants comme 3.2 et 1.6.

J'ai besoin de séparer le nombre en partie entière et décimale. Par exemple, une valeur de 3.2 serait séparée en deux nombres, c'est-à-dire 3 et 0.2

Obtenir la partie entière est facile:

n = Math.floor(n);

Mais j'ai du mal à obtenir la partie décimale. J'ai essayé ceci:

remainder = n % 2; //obtient la partie décimale

Mais cela ne fonctionne pas toujours correctement.

Le code précédent a la sortie suivante:

n = 3.1 // donne remainder = 1.1

Qu'est-ce que je rate ici?

2 votes

Veuillez noter que n = Math.floor(n) ne renvoie votre résultat souhaité (la partie entière) que pour les nombres non négatifs

0 votes

Utilisez % 1 plutôt que % 2

4 votes

decimalPart = number - Math.floor(number) de plus, vous pouvez y ajouter de la précision. parseFloat(decimalPart.toPrecision(3)) // point flottant avec une précision jusqu'à 3 chiffres

478voto

Ignacio Vazquez-Abrams Points 312628

Utilisez 1, pas 2.

js> 2.3 % 1
0.2999999999999998

99 votes

Dans un monde où 0,2999999999999998 est égal à 0,3, cela peut être acceptable. Pour moi, ce n'est pas le cas... Par conséquent, pour relever ce défi, je m'abstiendrais d'utiliser les opérations Math.* ou %.

84 votes

Pour éviter les problèmes d'arrondi des nombres à virgule flottante, l'utilisation de toFixed pourrait aider dans certaines situations par exemple (2.3 % 1).toFixed(4) == "0.3000".

22 votes

(2.3 % 1).toFixed(4).substring(2) = "3000" si vous en avez besoin sans le 0.

133voto

greenimpala Points 1081
var décimal = n - Math.floor(n)

Bien que cela ne fonctionnera pas pour les nombres négatifs, nous pourrions devoir faire

n = Math.abs(n); // Changer en positif
var décimal = n - Math.floor(n)

0 votes

Si vous avez déjà la partie entière, il n'est pas nécessaire d'appeler Math.floor() à nouveau -- utilisez simplement la partie entière que vous avez calculée.

5 votes

var n = 3.2, integr = Math.floor(n), decimal = n - integr; utilisez Math.floor() seulement une fois. integr = 3; decimal = 0.20000000000000018;

5 votes

Pour travailler avec des nombres négatifs, il suffit de remplacer Math.floor par Math.trunc.

99voto

sdleihssirhc Points 18791

Vous pourriez convertir en chaîne de caractères, n'est-ce pas ?

n = (n + "").split(".");

30 votes

Cela fonctionne bien partout sauf en Europe continentale où la virgule , est le séparateur décimal. Si vous envisagez de l'utiliser, n'oubliez pas de le prendre en compte si vous êtes multinational et ciblez l'Europe, car cette solution ne leur conviendra pas.

19 votes

Je viens d'Europe continentale avec un Firefox en français et ça fonctionne. Normalement, en France, nous utilisons la virgule comme séparateur décimal. La raison en est qu'en JavaScript, il n'y a pas de culture impliquée lors de la conversion d'un nombre en chaîne, bien que je préfère utiliser n.toString() au lieu de n + "" car c'est plus lisible.

5 votes

Si la vitesse est critique, alors n + "" est en effet meilleur (voir jsperf.com/number-vs-number-tostring-vs-string-number)

41voto

jomofrodo Points 73

Comment 0.2999999999999998 peut-il être une réponse acceptable? Si j'étais la personne posant la question, je voudrais une réponse de .3. Ce que nous avons ici est une fausse précision, et mes expériences avec floor, %, etc indiquent que Javascript aime la fausse précision pour ces opérations. Donc je pense que les réponses qui utilisent la conversion en chaîne de caractères sont sur la bonne voie.

Je ferais ceci :

var decPart = (n+"").split(".")[1];

Plus précisément, j'utilisais 100233.1 et je voulais la réponse ".1".

9 votes

Je suis généralement d'accord mais vous ne pouvez pas compter sur '.' le regex comme le séparateur décimal est un caractère i18n.

0 votes

Je réalise que je devrais souligner l'évidence - ma "réponse" n'est qu'une légère modification de la réponse de sdleihssirhc

2 votes

@jomofrodo En fait, certains pourraient préférer la valeur non arrondie. Je ne me souviens pas que l'OP demandait une valeur arrondie, juste des valeurs séparées.

4voto

David Sánchez Points 47

En fonction de l'utilisation que vous en ferez par la suite, mais cette solution simple pourrait également vous aider.

Je ne dis pas que c'est une bonne solution, mais pour certains cas concrets, ça fonctionne

var a = 10.2
var c = a.toString().split(".")
console.log(c[1] == 2) //True
console.log(c[1] === 2)  //False

Mais cela prendra plus de temps que la solution proposée par @Brian M. Hunt

(2.3 % 1).toFixed(4)

1 votes

Cela fonctionne très bien partout sauf en Europe continentale où une virgule , est le séparateur décimal. Si vous envisagez d'utiliser ceci, n'oubliez pas de prendre cela en compte si vous ciblez l'Europe, car cette solution ne fonctionnera pas très bien pour eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X