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));
user357034
la source

Réponses:

917

Vous pouvez utiliser toFixed () pour ce faire

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Mahesh Velaga
la source
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
Vlada
la source
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

Rob Boerman
la source
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));
pvanallen
la source
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));
}
Sauvage
la source
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

Antonio Terreno
la source
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
abhinav pandey
la source
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    
}
Nimesh
la source
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.

andora
la source
0

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

Exampale

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

//output
9.99
Rizo
la source
-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);
}
Mitre Slavchev
la source
-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);
    }
}
Arun Prasad ES
la source
-2

La solution qui fonctionne pour moi est la suivante

parseFloat(value)
Jorge Santos Neill
la source
-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;
  }
Thulasiram Virupakshi
la source
-3

J'ai une autre solution.

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

var twoPlacedFloat = parseFloat(yourString).round(2)
equipo_INSA-Inditex_OU
la source
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