En JavaScript, al convertir de un flotante a una cadena, ¿cómo puedo obtener solo 2 dígitos después del punto decimal? Por ejemplo, 0,34 en lugar de 0,3445434.
427
En JavaScript, al convertir de un flotante a una cadena, ¿cómo puedo obtener solo 2 dígitos después del punto decimal? Por ejemplo, 0,34 en lugar de 0,3445434.
Respuestas:
Los detalles , en caso de que el código no se explique por sí mismo.
editar: ... o simplemente usar
toFixed
, según lo propuesto por Tim Büthe . Olvidé esa, gracias (y un voto positivo) por el recordatorio :)fuente
toFixed()
imitará lo que hace algo asíprintf()
en C. Sin embargo,toFixed()
yMath.round()
manejará el redondeo de manera diferente. En este caso,toFixed()
tendrá el mismo tipo de efectoMath.floor()
que tendría (siempre que multiplique el original por 10 ^ n de antemano y llametoFixed()
con n dígitos). La "exactitud" de la respuesta depende mucho de lo que el OP quiere aquí, y ambos son "correctos" a su manera.Hay funciones para redondear números. Por ejemplo:
imprimirá 5.04.
EDITAR: violín
fuente
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
será igual"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
...Tenga cuidado al usar
toFixed()
:Primero, el redondeo del número se realiza utilizando la representación binaria del número, lo que puede conducir a un comportamiento inesperado. Por ejemplo
en lugar de
'0.6'
.En segundo lugar, hay un error de IE con
toFixed()
. En IE (al menos hasta la versión 7, no comprobé IE8), lo siguiente es cierto:Puede ser una buena idea seguir la sugerencia de kkyy o utilizar una
toFixed()
función personalizada , p. Ej.fuente
.toFixed()
método nativo en el valor de retorno, que agregará la cantidad requerida de precisión, por ejemplo:return (Math.round(value * power) / power).toFixed(precision);
y también devolverá el valor como una cadena. De lo contrario, se ignora la precisión de 20 para decimales más pequeñostoFixed
: tenga en cuenta que aumentar la precisión puede producir resultados inesperados:,(1.2).toFixed(16) === "1.2000000000000000"
mientras que(1.2).toFixed(17) === "1.19999999999999996"
(en Firefox / Chrome; en IE8, este último no se cumple debido a la menor precisión que IE8 puede ofrecer internamente).(0.598).toFixed(2)
no produce0.6
. Produce0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Un problema más a tener en cuenta es que
toFixed()
puede producir ceros innecesarios al final del número. Por ejemplo:La idea es limpiar la salida usando
RegExp
:El
RegExp
coincida con los ceros a la derecha (y opcionalmente la coma decimal) para asegurarse de que se ve bien para los enteros también.fuente
fuente
Hay un problema con todas esas soluciones flotando usando multiplicadores. Desafortunadamente, las soluciones de kkyy y Christoph están equivocadas.
Pruebe su código para el número 551.175 con 2 decimales: ¡se redondeará a 551.17 mientras que debería ser 551.18 ! Pero si pruebas para ex. 451.175 estará bien - 451.18. Por lo tanto, es difícil detectar este error a primera vista.
El problema es con la multiplicación: intente 551.175 * 100 = 55117.49999999999 (¡ups!)
Entonces, mi idea es tratarlo con toFixed () antes de usar Math.round ();
fuente
toFixed
se ve afectado:(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
... Cualquiera que sea el método utilizado, es mejor agregar un épsilon antes del redondeo.La clave aquí, supongo, es redondear correctamente primero, luego puede convertirlo a String.
Ahora puede formatear este valor de forma segura con toFixed (p). Entonces, con su caso específico:
fuente
Si desea la cadena sin redondeo, puede usar este RegEx (tal vez no sea la forma más eficiente ... pero es realmente fácil)
fuente
fuente
return float_part ? int_part+'.'+float_part : int_part;
de lo contrario si usted pasó entero, se volvió número con un punto al final (Ejemplo de entrada2100
, salida:2100.
)¿Quizás también quieras un separador decimal? Aquí hay una función que acabo de hacer:
fuente
No hay forma de evitar el redondeo inconsistente para precios con x.xx5 como valor real usando multiplicación o división. Si necesita calcular los precios correctos del lado del cliente, debe mantener todas las cantidades en centavos. Esto se debe a la naturaleza de la representación interna de los valores numéricos en JavaScript. Tenga en cuenta que Excel tiene los mismos problemas, por lo que la mayoría de las personas no notarían los pequeños errores causados por este fenómeno. Sin embargo, los errores pueden acumularse cada vez que sumas muchos valores calculados, hay una teoría completa que involucra el orden de los cálculos y otros métodos para minimizar el error en el resultado final. Para enfatizar los problemas con los valores decimales, tenga en cuenta que 0.1 + 0.2 no es exactamente igual a 0.3 en JavaScript, mientras que 1 + 2 es igual a 3.
fuente
fuente
Yo uso este código para formatear flotadores. Se basa en
toPrecision()
pero elimina los ceros innecesarios. Agradecería sugerencias sobre cómo simplificar la expresión regular.Ejemplo de uso:
fuente