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

Respuestas:


917

Puede usar toFixed () para hacer eso

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

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

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


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

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

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


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

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    
}

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.


0

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

Exampale

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

//output
9.99

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

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


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

-3

Tengo otra solución.

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.