Come analizzare il float con due cifre decimali in JavaScript?


412

Ho il codice seguente. Vorrei farlo in modo tale che se price_result è uguale a un numero intero, diciamo 10, allora vorrei aggiungere due cifre decimali. Quindi 10 sarebbero 10.00. O se è uguale a 10.6 sarebbe 10.60. Non sono sicuro di come si faccia.

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

Risposte:


917

Puoi usare toFixed () per farlo

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

1
felice di aiutare e continuare il buon lavoro su "imparare ogni giorno una cosa nuova"
Mahesh Velaga,

3
toFixed è piuttosto difettoso però. Inoltre, ecco un link migliore di w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz,

125
ma toFixed () restituisce il numero come stringa, se si confronteranno i numeri, è necessario utilizzare nuovamente parseFloat.
Pedro Muniz,

19
Usa var twoPlacedFloat = + parseFloat(yourString).toFixed(2)per convertire in float
Jose Rui Santos il

13
Aggiungi parentesi per ottenere un numero anziché una stringa: parseFloat ((yourString) .toFixed (2));
pvanallen,

50

Quando lo usi toFixed, restituisce sempre il valore come stringa. Questo a volte complica il codice. Per evitarlo, puoi creare un metodo alternativo per Numero.

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

e usa:

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

o semplicemente:

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

Ho scritto un programma carrello e ho provato a usare i metodi toFixed () e round () concatenati al metodo parseFloat (). Nessuno di questi metodi ha funzionato con parseFloat ().
Chris22,

Questo mi ha risparmiato alcuni futuri mal di testa. +1 solo per quello. Non avevo idea che avrebbe trasformato i numeri in stringhe.
Lukas,

@Lukas no, se parseFloat
Vlada,

Questo restituisce 2 se si applica al numero "2,00"
Saurin Dashadia,

Questo metodo è per le correzioni, non per la formattazione. Ad esempio: 0.1 + 0.2 // 0.30000000000000004quindi ho bisogno di correzioni per questo(0.1+0.2).round() // 0.3
Vlada

47

Se hai bisogno di prestazioni (come nei giochi):

Math.round(number * 100) / 100

È circa 100 volte più veloce di parseFloat (number.toFixed (2))

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


5
Con la formula precedente "2,00" restituisce 2. ma voglio che sia 2,00.
Saurin Dashadia,

5
Non puoi averlo in entrambi i modi. Se desideri che l'output sia un numero anziché una stringa, non otterrai zero finali. Quindi è possibile utilizzare quanto sopra convertito in una stringa: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen,

3
Aumenterò la velocità se cambio da 100 a 200?
alashow,

Se il numero di operazioni in virgola mobile rimane lo stesso, la velocità sarà la stessa, quindi no
Rob Boerman

perché non number * 1mi manca qualcosa di semplice forse 🤔?
ncubica,

11

Per restituire un numero, aggiungere un altro livello tra parentesi. Mantiene pulito.

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

2
Ti manca qualcosa nella tua formula? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))genera errore.
Saurin Dashadia,

scusate, avevo una variabile stringa invece di un numero, che toFixed () necessita - risolto ora. Ma la risposta di Rob usando Math.round è qualcosa da considerare in termini di prestazioni.
pvanallen,

Questo dovrebbe essere un commento alla risposta di Vlada.
Rodrirokr,

5

Se il tuo obiettivo è analizzare e il tuo input potrebbe essere letterale, allora ti aspetteresti a floate toFixednon lo fornirai, quindi ecco due semplici funzioni per fornire questo:

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

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

2
Quello non funziona come previsto. parseFloat(parseFloat('10.5').toFixed(2))ritorno 10.5previsto 10.50. Anche parseFloat(parseFloat('10.50').toFixed(2))ritorno10.5
MTK

È un float però, quindi 10.5 è uguale a 10.50
Savage

So che 10.5 == 10.50 ma devo stampare sul client 10.50 non 10.5
MTK

2

ceil di lodash è probabilmente il migliore

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

funzionerà anche con un numero ed è sicuro


1
Risposta valida se utilizzo lodash, attualmente sto usando underscore.js e attualmente a 1.9.1 non ha una funzione simile.
Rodrirokr,

1

@sd Risposta breve: in JS non è possibile avere il valore del tipo di dati Numero con zeri finali dopo un decimale.

Risposta lunga: è la proprietà toFixedo la toPrecisionfunzione di JavaScript, per restituire la stringa. La ragione di ciò è che il tipo di dati Numero non può avere un valore pari a = 2,00, rimuoverà sempre gli zeri finali dopo il decimale, questa è la proprietà incorporata del Numero tipo di dati. Quindi per ottenere quanto sopra in JS abbiamo 2 opzioni

  1. Utilizzare i dati come stringa o
  2. Accetto di avere un valore troncato con il caso '0' alla fine ex 2,50 -> 2,5. Numero Impossibile avere zero finali dopo i decimali

0

Utilizzare la funzione di seguito se non si desidera arrotondare.

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

Per quello che vale: un numero decimale, è un numero decimale, o lo arrotondi ad un altro valore o no. Internamente, approssimerà una frazione decimale in base alla regola dell'arthmetic e della gestione in virgola mobile. Rimane un numero decimale (virgola mobile, in JS un doppio) internamente, indipendentemente dal numero di cifre con cui si desidera visualizzarlo.

Per presentarlo per la visualizzazione, è possibile scegliere la precisione del display per qualsiasi cosa si desideri mediante la conversione di stringhe. La presentazione è un problema di visualizzazione, non di archiviazione.


0

È possibile utilizzare .toFixed () per per il valore float di 2 cifre

Exampale

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

//output
9.99

-1

Prova questo (vedi commenti nel codice):

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 semplice, stringa da float:

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 

Inizializza FormArray form Builder

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

Crea modulo

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

Impostare i valori dei moduli in Controller moduli

  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

Ho un'altra soluzione.

Puoi usare round()per farlo invecetoFixed()

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

7
@AustinHenley Ho provato a usare round () e non ha funzionato. Questo è probabilmente il motivo per cui le persone votano male. Potrebbe riferirsi a Math.round ()
Nathan il

@Nathan deve essere utilizzato in linea, dopo parseFloat()che ho aggiornato la risposta di @zsalzbank
Alastair

3
No, non funziona. Puoi provare Math.round (parseFloat (yourString), 2);
Augie Gardner,

1
Perché non sottovalutare una risposta che non funzionerà mai? Semplicemente non esiste un metodo come round()sui numeri in js. La vera domanda è chi ha votato a favore.
meandre
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.