web-dev-qa-db-fra.com

JavaScript: arrondissez le nombre de décimales, mais supprimez les zéros supplémentaires

Voici le scénario: je reçois .9999999999999999 Alors que je devrais recevoir 1.0.
Je peux me permettre de perdre une précision décimale. J'utilise donc .toFixed(15), quel type de travail.

L'arrondi fonctionne, mais le problème est qu'on me donne 1.000000000000000.
Y a-t-il un moyen d'arrondir à un nombre de décimales tout en supprimant les espaces supplémentaires?

Remarque: .toPrecision N'est pas ce que je veux; Je veux seulement spécifier combien de nombres après le point décimal.
Note 2: Je ne peux pas simplement utiliser .toPrecision(1) parce que je dois conserver la haute précision pour les nombres contenant des données après le point décimal. Idéalement, il y aurait exactement autant de décimales que nécessaire (jusqu'à 15).

73
Nathan
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0
131
Gus

Oui, il y a un moyen. Utilisez parseFloat().

parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1

Voir un exemple en direct ici: http://jsfiddle.net/nayish/7JBJw/

32
Nayish

Si je comprends bien, vous voulez supprimer les zéros de fin dans la chaîne que vous avez obtenue via toFixed(). C'est une opération de chaîne pure:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123
18
Jiri Kriz

Number(n.toFixed(15)) or +(n.toFixed(15)) convertira la chaîne décimale de 15 positions en un nombre, en supprimant les zéros de fin.

9
kennebec

Si vous convertissez la valeur de retour en nombre, les zéros à la fin seront supprimés. C'est aussi moins bavard que parseFloat().

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

Ceci utilise l'opérateur nary + . Par conséquent, si vous l'utilisez dans le cadre d'une opération sur une chaîne, vous devez disposer d'un infixe + avant: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));. FYI un unary + devant une chaîne la convertit en un nombre. De MDN: Unary + can:

convertit les représentations sous forme de chaîne d'entiers et de flottants, ainsi que les valeurs autres que de chaîne true, false et null. Les entiers aux formats décimal et hexadécimal (au format "0x") sont pris en charge. Les nombres négatifs sont pris en charge (mais pas pour l'hex). S'il ne peut pas analyser une valeur particulière, il sera évalué à NaN.

6
C. J.

Mmmm, une réponse un peu différente, pour le navigateur croisé aussi:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}
4
super

Aucune de ces réponses ne m'a vraiment apporté ce que je cherchais d'après le titre de la question, par exemple, 5,00 à 5,00 et 5.10 à 5,1. Ma solution était la suivante:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

Remarque: La regex ne fonctionne que si places > 0

P.S. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

1
Jenna Zeigen

Il existe une meilleure méthode qui conserve la précision et supprime les zéros. Cela prend un numéro d’entrée et, grâce à la magie du casting, supprimera tous les zéros. J'ai trouvé que 16 était la limite de précision pour moi, ce qui est plutôt bien si vous ne mettiez pas de satellite sur pluto.

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));
0
Kevrone