web-dev-qa-db-fra.com

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

J'ai des nombres flottants comme 3.2 et 1.6.

Je dois séparer le nombre dans la partie entière et décimale. Par exemple, une valeur de 3.2 serait scindée en deux nombres, à savoir 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:

remainer = n % 2; //obtem a parte decimal do rating

Mais cela ne fonctionne pas toujours correctement.

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

n = 3.1 => remainer = 1.1

Qu'est-ce qui me manque ici?

194
Oscar

Utilisez 1, pas 2.

js> 2.3 % 1
0.2999999999999998
295
var decimal = n - Math.floor(n)

Bien que cela ne fonctionne pas pour des nombres moins, nous pourrions avoir à faire

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)
77
greenimpala

Vous pouvez convertir en chaîne, non?

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

Comment 0.2999999999999998 est-il une réponse acceptable? Si j'étais le demandeur, 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 est friand de fausse précision pour ces opérations. Je pense donc que les réponses qui utilisent la conversion en chaîne sont sur la bonne voie. 

Je voudrais faire ceci:

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

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

27
jomofrodo

Voici comment je le fais, ce qui me semble être le moyen le plus simple de le faire:

var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2
11
Zantafio

Une façon simple de le faire est:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018

Malheureusement, cela ne retourne pas la valeur exacte. Cependant, cela est facilement corrigé:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals.toFixed(1)); //Returns 0.2

Vous pouvez utiliser ceci si vous ne connaissez pas le nombre de décimales:

var x = 3.2;
var decimals = x - Math.floor(x);

var decimalPlaces = x.toString().split('.')[1].length;
decimals = decimals.toFixed(decimalPlaces);

console.log(decimals); //Returns 0.2

9
Ethan

Ce qui suit fonctionne quels que soient les paramètres régionaux du séparateur décimal ... à la condition qu'un seul caractère est utilisé pour un séparateur.

var n = 2015.15;
var integer = Math.floor(n).toString();
var strungNumber = n.toString();
if (integer.length === strungNumber.length)
  return "0";
return strungNumber.substring(integer.length + 1);

Ce n'est pas joli, mais c'est exact.

5
cdmdotnet

Manière indépendante de la langue:

var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3

notez qu'il ne corrige que pour les nombres d'une longueur décimale) 

4
Nurlan

Vous pouvez le convertir en chaîne et utiliser la méthode replace pour remplacer la partie entière par zéro, puis reconvertir le résultat en un nombre: 

var number = 123.123812,
    decimals = +number.toString().replace(/^[^\.]+/,'0');
4
gion_13

En fonction de l'utilisation que vous ferez après, mais cette solution simple pourrait également vous aider. 

Je ne dis pas que c'est une bonne solution, mais pour des cas concrets, cela 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)
4
David Sánchez

Si la précision compte et si vous souhaitez obtenir des résultats cohérents, voici quelques propositions qui renverront la partie décimale de tout nombre sous forme de chaîne, y compris le "0" initial. Si vous en avez besoin en tant que float, ajoutez simplement var f = parseFloat( result ) à la fin.

Si la partie décimale est égale à zéro, "0.0" sera renvoyé. Null, NaN et les nombres non définis ne sont pas testés.

1. String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = "0." + ( narray.length > 1 ? narray[1] : "0" );

2. String.substring, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");

3. Math.floor, Number.toFixed, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");

4. Math.floor, Number.toFixed, String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = (narray.length > 1 ? (n - Math.floor(n)).toFixed(narray[1].length) : "0.0");

Voici un lien jsPerf: https://jsperf.com/decpart-of-number/

Nous pouvons voir que la proposition n ° 2 est la plus rapide.

3
Gabriel Hautclocq

Vous pouvez utiliser la fonction parseInt() pour obtenir la partie entière, puis celle-ci pour extraire la partie décimale.

var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;
2
Sheki

Dans un cas, je savais que tous les nombres en question n’auraient qu’une décimale et je voulais obtenir la partie décimale sous forme d’entier, alors j’ai utilisé cette méthode:

var number = 3.1,
    decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1

Cela fonctionne bien aussi avec des entiers, retournant 0 dans ces cas.

1
walpek

J'utilise:

var n = -556.123444444;
var str = n.toString();
var decimalOnly = 0;

if( str.indexOf('.') != -1 ){ //check if has decimal
    var decimalOnly = parseFloat(Math.abs(n).toString().split('.')[1]);
}

Entrée: -556.123444444

Résultat: 123444444

1
DavidDunham

Bien que je sois très en retard pour répondre à cette question, veuillez consulter le code.

let floatValue = 3.267848;
let decimalDigits = floatValue.toString().split('.')[1];
let decimalPlaces = decimalDigits.length;
let decimalDivider = Math.pow(10, decimalPlaces);
let fractionValue = decimalDigits/decimalDivider;
let integerValue = floatValue - fractionValue;

console.log("Float value: "+floatValue);
console.log("Integer value: "+integerValue);
console.log("Fraction value: "+fractionValue)
0
Hifzur Rahman

Après avoir examiné plusieurs d'entre eux, j'utilise maintenant ...

var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);
0
Patrick
n = Math.floor(x);
remainder = x % 1;
0
masterxilo

Les fonctions mathématiques sont plus rapides, mais renvoient toujours des valeurs attendues non natives. Le moyen le plus simple que j'ai trouvé est

(3.2+'').replace(/^[-\d]+\./, '')
0
Vasilii Suricov