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));

Antworten:


915

Sie können dazu toFixed () verwenden

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

1

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

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


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));

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));
}

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


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

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    
}

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.


0

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

Exampale

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

//output
9.99

-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);
}

-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);
    }
}


-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;
  }

-3

Ich habe eine andere Lösung.

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.