Comment analyser un flottant avec deux décimales en javascript?


412

J'ai le code suivant. Je voudrais qu'il soit tel que si price_result est égal à un entier, disons 10, alors je voudrais ajouter deux décimales. Donc 10 serait 10,00. Ou si elle est égale à 10,6 serait 10,60. Je ne sais pas comment faire cela.

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));

Réponses:


917

Vous pouvez utiliser toFixed () pour ce faire

var twoPlacedFloat = parseFloat(yourString).toFixed(2)

1
heureux d'aider et de continuer à faire du bon travail - "apprendre une nouvelle chose chaque jour"
Mahesh Velaga

3
toFixed est cependant assez bogué. En outre, voici un meilleur lien que w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz

125
mais toFixed () renvoie nombre sous forme de chaîne, si vous comparez des nombres, vous devez utiliser à nouveau parseFloat.
Pedro Muniz

19
Utilisez var twoPlacedFloat = + parseFloat(yourString).toFixed(2)pour convertir en flottant
Jose Rui Santos

13
Ajoutez des parens pour obtenir un nombre au lieu d'une chaîne: parseFloat ((yourString) .toFixed (2));
pvanallen

50

Lorsque vous utilisez toFixed, il renvoie toujours la valeur sous forme de chaîne. Cela complique parfois le code. Pour éviter cela, vous pouvez créer une autre méthode pour Number.

Number.prototype.round = function(p) {
  p = p || 10;
  return parseFloat( this.toFixed(p) );
};

et utilise:

var n = 22 / 7; // 3.142857142857143
n.round(3); // 3.143

ou simplement:

(22/7).round(3); // 3.143

J'ai écrit un programme de panier d'achat et essayé d'utiliser les méthodes toFixed () et round () chaînées à la méthode parseFloat (). Aucune de ces méthodes ne fonctionnait avec le parseFloat ().
Chris22

Cela m'a évité quelques futurs maux de tête. +1 juste pour ça. Je ne savais pas que cela transformerait les nombres en chaînes.
Lukas

@Lukas N'est pas, si parseFloat
Vlada

Cela renvoie 2 si je
postule au

Cette méthode est destinée aux corrections et non au formatage. Par exemple: 0.1 + 0.2 // 0.30000000000000004j'ai donc besoin d'une correction pour cela(0.1+0.2).round() // 0.3
Vlada

47

Si vous avez besoin de performances (comme dans les jeux):

Math.round(number * 100) / 100

C'est environ 100 fois plus rapide que parseFloat (number.toFixed (2))

http://jsperf.com/parsefloat-tofixed-vs-math-round


5
Avec la formule ci-dessus, «2,00» renvoie 2, mais je veux que ce soit 2,00.
Saurin Dashadia

5
Vous ne pouvez pas jouer sur les deux tableaux. Si vous souhaitez que la sortie soit un nombre au lieu d'une chaîne, vous n'obtiendrez pas de zéros de fin. Vous pouvez donc utiliser ce qui précède converti en chaîne: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
La vitesse augmentera-t-elle si je change de 100 en 200?
alashow

Si le nombre d'opérations en virgule flottante reste le même, la vitesse sera la même, alors non
Rob Boerman

pourquoi pas simple number * 1je manque quelque chose peut-être 🤔?
ncubica

11

Pour renvoyer un nombre, ajoutez une autre couche de parenthèses. Le garde propre.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));

2
Vous manquez quelque chose dans votre formule? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))génère une erreur.
Saurin Dashadia

désolé, avait une variable chaîne au lieu d'un nombre, dont toFixed () a besoin - corrigé maintenant. Mais la réponse de Rob en utilisant Math.round est quelque chose à considérer en termes de performances.
pvanallen

Cela devrait être un commentaire à la réponse de Vlada.
Rodrirokr

5

Si votre objectif est d'analyser et que votre entrée peut être un littéral, alors vous vous attendez à un floatet toFixedne le fournira pas, alors voici deux fonctions simples pour fournir ceci:

function parseFloat2Decimals(value) {
    return parseFloat(parseFloat(value).toFixed(2));
}

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}

2
Cela ne fonctionne pas comme prévu. parseFloat(parseFloat('10.5').toFixed(2))retour 10.5espéré 10.50. Aussi parseFloat(parseFloat('10.50').toFixed(2))retour10.5
MTK

C'est un flotteur, donc 10,5 est égal à 10,50
Savage

Je sais que 10,5 == 10,50 mais j'ai besoin d'imprimer sur le client 10,50 et non 10,5
MTK

2

le plafond de lodash est probablement le meilleur

_.ceil("315.9250488",2) 
_.ceil(315.9250488,2) 
_.ceil(undefined,2)
_.ceil(null,2)
_.ceil("",2)

fonctionnera également avec un numéro et il est sûr


1
Réponse viable si j'utilise lodash, j'utilise actuellement underscore.js et actuellement à 1.9.1 n'a pas de fonction similaire.
Rodrirokr

1

@sd Réponse courte: il n'y a aucun moyen dans JS d'avoir une valeur de type de données Number avec des zéros de fin après une décimale.

Réponse longue: c'est la propriété toFixedou la toPrecisionfonction de JavaScript, pour renvoyer la chaîne. La raison en est que le type de données Number ne peut pas avoir une valeur comme a = 2,00, il supprimera toujours les zéros de fin après la décimale, il s'agit de la propriété intégrée du type de données Number. Donc, pour atteindre ce qui précède dans JS, nous avons 2 options

  1. Utilisez les données sous forme de chaîne ou
  2. Acceptez d'avoir une valeur tronquée avec le cas «0» à la fin ex 2,50 -> 2,5. Nombre ne peut pas avoir de zéros de fin après la décimale

0

Veuillez utiliser la fonction ci-dessous si vous ne souhaitez pas arrondir.

function ConvertToDecimal(num) {
    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
   alert('M : ' +  Number(num)); //If you need it back as a Number    
}

0

Pour ce que ça vaut: Un nombre décimal, est un nombre décimal, vous l'arrondissez à une autre valeur ou non. En interne, il se rapprochera d'une fraction décimale selon la règle de l'arthmétique et de la manipulation en virgule flottante. Il reste un nombre décimal (virgule flottante, dans JS un double) en interne, quel que soit le nombre de chiffres avec lesquels vous souhaitez l'afficher.

Pour le présenter pour l'affichage, vous pouvez choisir la précision de l'affichage à tout ce que vous voulez par conversion de chaîne. La présentation est un problème d'affichage, pas un problème de stockage.


0

Vous pouvez utiliser .toFixed () pour une valeur flottante à 2 chiffres

Exampale

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

-1

Essayez ceci (voir les commentaires dans le code):

function fixInteger(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseInt(value);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseInt(value);
    }
    // apply new value to element
    $(el).val(newValue);
}

function fixPrice(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseFloat(value.replace(',', '.')).toFixed(2);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseFloat(value).toFixed(2);
    }
    // apply new value to element
    $(el).val(newValue);
}

-1

JavaScript simple, chaîne à flotter:

var it_price = chief_double($("#ContentPlaceHolder1_txt_it_price").val());

function chief_double(num){
    var n = parseFloat(num);
    if (isNaN(n)) {
        return "0";
    }
    else {
        return parseFloat(num);
    }
}


-2
Solution for FormArray controllers 

Initialiser le générateur de formulaires FormArray

  formInitilize() {
    this.Form = this._formBuilder.group({
      formArray: this._formBuilder.array([this.createForm()])
    });
  }

Créer un formulaire

  createForm() {
    return (this.Form = this._formBuilder.group({
      convertodecimal: ['']
    }));
  }

Définir des valeurs de formulaire dans Form Controller

  setFormvalues() {
    this.Form.setControl('formArray', this._formBuilder.array([]));
    const control = <FormArray>this.resourceBalanceForm.controls['formArray'];
    this.ListArrayValues.forEach((x) => {
      control.push(this.buildForm(x));
    });
  }

  private buildForm(x): FormGroup {
    const bindvalues= this._formBuilder.group({
      convertodecimal: x.ArrayCollection1? parseFloat(x.ArrayCollection1[0].name).toFixed(2) : '' // Option for array collection
// convertodecimal: x.number.toFixed(2)    --- option for two decimal value 
    });

    return bindvalues;
  }

-3

J'ai une autre solution.

Vous pouvez utiliser round()pour le faire à la placetoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)

7
@AustinHenley J'ai essayé d'utiliser round () et cela n'a pas fonctionné. C'est probablement pourquoi les gens votent. Il fait peut-être référence à Math.round ()
Nathan

@Nathan, il doit être utilisé en ligne, après parseFloat()avoir mis à jour la réponse de @zsalzbank
Alastair

3
Non, ça ne marche pas. Vous pouvez essayer Math.round (parseFloat (yourString), 2);
Augie Gardner

1
Pourquoi ne pas voter contre une réponse qui ne fonctionnera jamais? Il n'y a tout simplement pas de méthode telle que round()sur les nombres en js. La vraie question est de savoir qui a voté contre.
meandre
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.