¿Cómo analizar flotante con dos decimales en javascript?

412

tengo el siguiente código. Me gustaría tenerlo de modo que si price_result sea igual a un número entero, digamos 10, entonces me gustaría agregar dos lugares decimales. Entonces 10 sería 10.00. O si es igual a 10.6 sería 10.60. No estoy seguro de cómo hacer esto.

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

Respuestas:

917

Puede usar toFixed () para hacer eso

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Mahesh Velaga
fuente
1
Me alegra ayudar y continuar con el buen trabajo - "aprender algo nuevo todos los días"
Mahesh Velaga
3
Sin embargo, toFixed es bastante defectuoso. Además, aquí hay un mejor enlace que w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz
125
pero toFixed () devuelve el número como una cadena, si va a comparar números, debe usar parseFloat nuevamente.
Pedro Muniz
19
Usar var twoPlacedFloat = + parseFloat(yourString).toFixed(2)para convertir en flotador
Jose Rui Santos
13
Agregue parens para obtener un número en lugar de una cadena: parseFloat ((yourString) .toFixed (2));
pvanallen
50

Cuando lo usa toFixed, siempre devuelve el valor como una cadena. Esto a veces complica el código. Para evitar eso, puede hacer un método alternativo para Number.

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

y use:

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

o simplemente:

(22/7).round(3); // 3.143
Vlada
fuente
Escribí un programa de carrito de compras e intenté usar los métodos toFixed () y round () encadenados al método parseFloat (). Ninguno de estos métodos funcionó con parseFloat ().
Chris22
Esto me ahorró algunos dolores de cabeza futuros. +1 solo por eso. No tenía idea de que convertiría los números en cadenas.
Lukas
@Lukas no lo es, si parseFloat
Vlada
Esto devuelve 2 si
solicito el
Este método es para correcciones, no para formatear. Por ejemplo: 0.1 + 0.2 // 0.30000000000000004entonces necesito corrección para eso(0.1+0.2).round() // 0.3
Vlada
47

Si necesita rendimiento (como en los juegos):

Math.round(number * 100) / 100

Es aproximadamente 100 veces más rápido que parseFloat (number.toFixed (2))

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

Rob Boerman
fuente
55
Con la fórmula anterior, '2.00' devuelve 2. pero quiero que sea 2.00.
Saurin Dashadia
55
No puedes tenerlo en ambos sentidos. Si desea que la salida sea un número en lugar de una cadena, no obtendrá ceros finales. Entonces, podría usar lo anterior convertido en una cadena: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen
3
¿Aumentará la velocidad si cambio de 100 a 200?
alashow
Si el número de operaciones de coma flotante se mantiene igual, la velocidad será la misma, entonces no
Rob Boerman
¿Por qué no simple? number * 1Me estoy perdiendo algo, tal vez
ncubica
11

Para devolver un número, agregue otra capa de paréntesis. Lo mantiene limpio

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
pvanallen
fuente
2
¿Te falta algo en tu fórmula? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))genera error
Saurin Dashadia
lo siento, tenía una variable de cadena en lugar de un número, que toFixed () necesita, arreglado ahora. Pero la respuesta de Rob usando Math.round es algo a considerar en términos de rendimiento.
pvanallen
Esto debería ser un comentario a la respuesta de Vlada.
Rodrirokr
5

Si su objetivo es analizar, y su entrada puede ser literal, entonces esperaría un floaty toFixedno proporcionará eso, así que aquí hay dos funciones simples para proporcionar esto:

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

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}
Salvaje
fuente
2
Eso no funciona como se esperaba. parseFloat(parseFloat('10.5').toFixed(2))volver 10.5esperado 10.50. También parseFloat(parseFloat('10.50').toFixed(2))regreso10.5
MTK
Sin embargo, es un flotador, por lo que 10.5 es igual a 10.50
Savage
Sé que 10.5 == 10.50 pero necesito imprimir al cliente 10.50 no 10.5
MTK
2

techo de lodash es probablemente el mejor

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

funcionará también con un número y es seguro

Antonio Terreno
fuente
1
Respuesta viable si estoy usando lodash, actualmente estoy usando underscore.js y actualmente en 1.9.1 no tiene una función similar.
Rodrirokr
1

@sd Respuesta corta: No hay forma en JS de tener un valor de tipo de datos de Número con ceros finales después de un decimal.

Respuesta larga: es propiedad toFixedo toPrecisionfunción de JavaScript, para devolver la cadena. La razón de esto es que el tipo de datos Number no puede tener un valor como a = 2.00, siempre eliminará los ceros finales después del decimal. Esta es la propiedad incorporada de Number Datatype. Entonces, para lograr lo anterior en JS, tenemos 2 opciones

  1. Utilice los datos como una cadena o
  2. Acuerde tener un valor truncado con el caso '0' al final ex 2.50 -> 2.5. El número no puede tener ceros al final del decimal
abhinav pandey
fuente
0

Utilice la siguiente función si no desea redondear.

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

Por lo que vale: un número decimal, es un número decimal, o lo redondea a otro valor o no. Internamente, se aproximará a una fracción decimal de acuerdo con la regla de la artética y el manejo de coma flotante. Permanece un número decimal (coma flotante, en JS un doble) internamente, sin importar cuántos dígitos desee mostrar.

Para presentarlo para su visualización, puede elegir la precisión de la visualización según lo que desee mediante la conversión de cadenas. La presentación es un problema de visualización, no una cuestión de almacenamiento.

andora
fuente
0

Puede usar .toFixed () para el valor flotante de 2 dígitos

Exampale

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

//output
9.99
Rizo
fuente
-1

Pruebe esto (vea los comentarios en el código):

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
fuente
-1

JavaScript simple, cadena para flotar:

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

La solución que funciona para mí es la siguiente

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

Inicialice FormArray form Builder

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

Crear formulario

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

Establecer valores de formulario en el controlador de formulario

  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
fuente
-3

Tengo otra solución.

Puedes usar round()para hacer eso en su lugartoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)
equipo_INSA-Inditex_OU
fuente
77
@AustinHenley Intenté usar round () y no funcionó. Esa es probablemente la razón por la cual la gente está votando mal Puede estar refiriéndose a Math.round ()
Nathan
@Nathan necesita ser utilizado en línea, después de parseFloat()que he actualizado la respuesta por @zsalzbank
Alastair
3
No, no funciona Puede probar Math.round (parseFloat (yourString), 2);
Augie Gardner
1
¿Por qué no rechazar una respuesta que nunca funcionará? Simplemente no existe tal método como round()en números en js. La verdadera pregunta es quién votó esto.
meandre