Wie analysiere ich float mit zwei Dezimalstellen in Javascript?

410

Ich habe den folgenden Code. Ich möchte es so haben, dass ich, wenn price_result gleich einer ganzen Zahl ist, sagen wir 10, zwei Dezimalstellen hinzufügen möchte. 10 wäre also 10.00. Oder wenn es gleich 10,6 wäre, wäre es 10,60. Ich bin mir nicht sicher, wie ich das machen soll.

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

Antworten:

915

Sie können dazu toFixed () verwenden

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Mahesh Velaga
quelle
1
Ich bin
3
toFixed ist allerdings ziemlich fehlerhaft. Hier ist auch ein besserer Link als w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz
125
Aber toFixed () gibt number als Zeichenfolge zurück. Wenn Sie Zahlen vergleichen möchten, müssen Sie parseFloat erneut verwenden.
Pedro Muniz
19
Verwenden Sie var twoPlacedFloat = + parseFloat(yourString).toFixed(2), um zu konvertieren, um zu schweben
Jose Rui Santos
13
Fügen Sie parens hinzu, um eine Zahl anstelle einer Zeichenfolge zu erhalten: parseFloat ((yourString) .toFixed (2));
Pvanallen
50

Wenn Sie verwenden toFixed, wird der Wert immer als Zeichenfolge zurückgegeben. Dies kompliziert manchmal den Code. Um dies zu vermeiden, können Sie eine alternative Methode für Number erstellen.

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

und verwenden:

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

oder einfach:

(22/7).round(3); // 3.143
Vlada
quelle
Ich habe ein Warenkorbprogramm geschrieben und versucht, die Methoden toFixed () und round () zu verwenden, die mit der Methode parseFloat () verkettet sind. Keine dieser Methoden funktionierte mit parseFloat ().
Chris22
Dies ersparte mir einige zukünftige Kopfschmerzen. +1 nur dafür. Ich hatte keine Ahnung, dass es Zahlen in Strings verwandeln würde.
Lukas
@ Lukas ist nicht, wenn parseFloat
Vlada
Dies gibt 2 zurück, wenn ich mich für die Nummer '2.00'
bewerbe
Diese Methode dient zur Korrektur und nicht zur Formatierung. Zum Beispiel: 0.1 + 0.2 // 0.30000000000000004(0.1+0.2).round() // 0.3
Vlada
47

Wenn Sie Leistung benötigen (wie in Spielen):

Math.round(number * 100) / 100

Es ist ungefähr 100 Mal so schnell wie parseFloat (number.toFixed (2))

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

Rob Boerman
quelle
5
Mit der obigen Formel '2.00' wird 2. zurückgegeben, aber ich möchte, dass es 2.00 ist.
Saurin Dashadia
5
Sie können es nicht in beide Richtungen haben. Wenn die Ausgabe eine Zahl anstelle einer Zeichenfolge sein soll, werden keine nachgestellten Nullen angezeigt. Sie können also das oben in eine Zeichenfolge konvertierte verwenden: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen
3
Wird sich die Geschwindigkeit erhöhen, wenn ich 100er auf 200er ändere?
Alashow
Wenn die Anzahl der Gleitkommaoperationen gleich bleibt, ist die Geschwindigkeit gleich, also nein
Rob Boerman
warum nicht einfach number * 1vermisse ich vielleicht etwas 🤔?
Ncubica
11

Fügen Sie eine weitere Ebene in Klammern hinzu, um eine Zahl zurückzugeben. Hält es sauber.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
pvanallen
quelle
2
Vermissen Sie etwas in Ihrer Formel? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))erzeugt einen Fehler.
Saurin Dashadia
Entschuldigung, hatte eine String-Variable anstelle einer Zahl, die toFixed () benötigt - jetzt behoben. Robs Antwort mit Math.round ist jedoch in Bezug auf die Leistung zu berücksichtigen.
pvanallen
Dies sollte ein Kommentar zu Vladas Antwort sein.
Rodrirokr
5

Wenn Ihr Ziel das Parsen ist und Ihre Eingabe möglicherweise ein Literal ist, würden Sie ein erwarten floatund dies toFixednicht bereitstellen. Hier sind zwei einfache Funktionen, um dies bereitzustellen:

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

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}
Wild
quelle
2
Das funktioniert nicht wie erwartet. parseFloat(parseFloat('10.5').toFixed(2))Rückkehr 10.5erwartet 10.50. Auch parseFloat(parseFloat('10.50').toFixed(2))zurück10.5
MTK
Es ist ein Float, also ist 10.5 gleich 10.50
Savage
Ich weiß, dass 10.5 == 10.50, aber ich muss auf Client 10.50 drucken, nicht 10.5
MTK
2

Decke von lodash ist wahrscheinlich die beste

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

wird auch mit einer Nummer arbeiten und es ist sicher

Antonio Terreno
quelle
1
Eine brauchbare Antwort, wenn ich lodash verwende. Ich verwende derzeit underscore.js und habe derzeit bei 1.9.1 keine ähnliche Funktion.
Rodrirokr
1

@sd Kurze Antwort: In JS gibt es keine Möglichkeit, den Datentyp Number mit nach einer Dezimalstelle nachgestellten Nullen zu setzen.

Lange Antwort: Es ist die Eigenschaft toFixedoder toPrecisionFunktion von JavaScript, den String zurückzugeben. Der Grund dafür ist, dass der Datentyp Number keinen Wert wie a = 2.00 haben kann. Er entfernt immer die nachgestellten Nullen nach der Dezimalstelle. Dies ist die eingebaute Eigenschaft des Datentyps Number. Um dies in JS zu erreichen, haben wir zwei Möglichkeiten

  1. Verwenden Sie entweder Daten als Zeichenfolge oder
  2. Stimmen Sie zu, den Wert mit dem Fall '0' am Ende ab 2,50 -> 2,5 abgeschnitten zu haben. Zahl Nach der Dezimalstelle dürfen keine nachgestellten Nullen stehen
Abhinav Pandey
quelle
0

Bitte verwenden Sie die folgende Funktion, wenn Sie nicht abrunden möchten.

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
quelle
0

Für was es wert ist: Eine Dezimalzahl ist eine Dezimalzahl, Sie runden sie entweder auf einen anderen Wert oder nicht. Intern wird ein Dezimalbruch gemäß der Regel der Gleitkomma-Arthmetik und -Handhabung angenähert. Es bleibt intern eine Dezimalzahl (Gleitkomma, in JS ein Doppel), unabhängig davon, mit wie vielen Ziffern Sie es anzeigen möchten.

Um es für die Anzeige zu präsentieren, können Sie die Genauigkeit der Anzeige durch Konvertierung von Zeichenfolgen nach Belieben auswählen. Die Präsentation ist ein Anzeigeproblem, keine Speichersache.

andora
quelle
0

Sie können .toFixed () verwenden, um einen 2-stelligen Gleitkommawert zu erhalten

Exampale

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

//output
9.99
Rizo
quelle
-1

Versuchen Sie dies (siehe Kommentare im 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
quelle
-1

Einfaches JavaScript, String zum Floaten:

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
quelle
-2

Die Lösung, die für mich funktioniert, ist die folgende

parseFloat(value)
Jorge Santos Neill
quelle
-2
Solution for FormArray controllers 

Initialisieren Sie den FormArray Form Builder

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

Formular erstellen

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

Festlegen von Formularwerten in 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
quelle
-3

Ich habe eine andere Lösung.

Sie können round()dies stattdessen verwendentoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)
equipo_INSA-Inditex_OU
quelle
7
@AustinHenley Ich habe versucht, round () zu verwenden und es hat nicht funktioniert. Das ist wahrscheinlich der Grund, warum die Leute nicht wählen. Er kann sich auf Math.round ()
Nathan
@ Nathan es muss inline verwendet werden, nachdem parseFloat()ich die Antwort von @zsalzbank
Alastair
3
Nein, es funktioniert nicht. Sie können Math.round (parseFloat (yourString), 2) ausprobieren.
Augie Gardner
1
Warum nicht eine Antwort ablehnen, die niemals funktionieren wird? Es gibt einfach keine Methode wie round()für Zahlen in js. Die eigentliche Frage ist, wer dies befürwortet hat.
Meandre