Tengo esta línea de código que redondea mis números a dos decimales. Pero obtengo números como este: 10.8, 2.4, etc. Esta no es mi idea de dos decimales, entonces, ¿cómo puedo mejorar lo siguiente?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
Quiero números como 10.80, 2.40, etc. El uso de jQuery está bien para mí.
javascript
rounding
decimal-point
Abdominales
fuente
fuente
0.565
,0.575
,1.005
), puedo sugerir mirando de nuevo a esta respuesta , lo cual les ayuda corregir?number.toFixed(x)
método para convertirlo en una cadena con la cantidad requerida de ceros. Por ejemplo, redondear1.34
a1.3
con el método de navegador cruzado, luego agregar 1 cero y convertir a cadena con1.3.toFixed(2)
(para obtener"1.30"
)Respuestas:
Para formatear un número usando notación de punto fijo, simplemente puede usar el método toFixed :
Tenga en cuenta que
toFixed()
devuelve una cadena.IMPORTANTE : Tenga en cuenta que toFixed no se redondea el 90% del tiempo, devolverá el valor redondeado, pero en muchos casos, no funciona.
Por ejemplo:
2.005.toFixed(2) === "2.00"
ACTUALIZAR:
Hoy en día, puedes usar el
Intl.NumberFormat
constructor. Es parte de la especificación de API de internacionalización ECMAScript (ECMA402). Tiene muy buena soporte de los navegadores , incluyendo incluso EI11, y es totalmente compatible con Node.js .Alternativamente, puede usar el
toLocaleString
método, que internamente usará laIntl
API:Esta API también le ofrece una amplia variedad de opciones para formatear, como miles de separadores, símbolos de moneda, etc.
fuente
(0.09).toFixed(1);
da 0.0 en IE8Math.Round(0.09)
volverá,0
así que esto siempre dará0.0
...Math.round(value*100)/100
funciona mejor para 2DP.Este es un tema antiguo, pero aún tiene los mejores resultados de Google y las soluciones ofrecidas comparten el mismo problema de decimales de coma flotante. Aquí está la función (muy genérica) que uso, gracias a MDN :
Como podemos ver, no tenemos estos problemas:
Este carácter genérico también proporciona algunas cosas interesantes:
Ahora, para responder la pregunta del OP, uno tiene que escribir:
O, para una función más concisa, menos genérica:
Puedes llamarlo con:
Varios ejemplos y pruebas (¡gracias a @ tj-crowder !):
Mostrar fragmento de código
fuente
Por lo general, agrego esto a mi biblioteca personal, y después de algunas sugerencias y de usar la solución @TIMINeutron también, y hacer que se adapte a la longitud decimal, esta se adapta mejor:
funcionará para las excepciones reportadas.
fuente
No sé por qué no puedo agregar un comentario a una respuesta anterior (tal vez estoy ciego, no sé), pero se me ocurrió una solución usando la respuesta de @Miguel:
Y sus dos comentarios (de @bighostkim y @Imre):
precise_round(1.275,2)
no devolver 1.28precise_round(6,2)
no devolver 6.00 (como él quería).Mi solución final es la siguiente:
Como puede ver, tuve que agregar un poco de "corrección" (no es lo que es, pero como Math.round tiene pérdidas, puede verificarlo en jsfiddle.net; esta es la única forma en que supe cómo "arreglar" " eso). Agrega 0.001 al número ya rellenado, por lo que agrega
1
tres0
s a la derecha del valor decimal. Por lo tanto, debe ser seguro de usar.Después de eso agregué
.toFixed(decimal)
para generar siempre el número en el formato correcto (con la cantidad correcta de decimales).Entonces eso es todo. Úsalo bien ;)
EDITAR: funcionalidad agregada a la "corrección" de números negativos.
fuente
precise_round(1.27499,2)
ahora también devuelve 1.28 ... No esMath.round
que sea con pérdida; la forma en que las computadoras almacenan internamente valores de punto flotante es. Básicamente, estás condenado a fallar con algunos valores antes de que los datos lleguen a tu función :)Una forma de estar 100% seguro de obtener un número con 2 decimales:
Si esto causa errores de redondeo, puede usar lo siguiente como James ha explicado en su comentario:
fuente
var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Use este método a continuación
Y si desea que el número sea fijo, use
fuente
No encontré una solución precisa para este problema, así que creé la mía propia:
Ejemplos:
fuente
@heridev y yo creamos una pequeña función en jQuery.
Puedes probar a continuación:
HTML
jQuery
DEMO EN LÍNEA:
http://jsfiddle.net/c4Wqn/
fuente
input
evento. Esto no crea un efecto de parpadeo y también se dispara cuando accede al campo con JSEl problema con los valores de coma flotante es que están tratando de representar una cantidad infinita de valores (continuos) con una cantidad fija de bits. Entonces, naturalmente, debe haber alguna pérdida en el juego, y te van a morder algunos valores.
Cuando una computadora almacena 1.275 como un valor de coma flotante, en realidad no recordará si era 1.275 o 1.27499999999999993, o incluso 1.27500000000000002. Estos valores deberían dar resultados diferentes después de redondear a dos decimales, pero no lo harán, ya que para la computadora se ven exactamente iguales después del almacenamiento como valores de punto flotante, y no hay forma de restaurar los datos perdidos. Cualquier cálculo adicional solo acumulará tal imprecisión.
Por lo tanto, si la precisión es importante, debe evitar los valores de coma flotante desde el principio. Las opciones más simples son
Por ejemplo, cuando se usan números enteros para almacenar el número de centésimos, la función para encontrar el valor real es bastante simple:
Con cadenas, necesitará redondear, pero aún es manejable:
Tenga en cuenta que esta función se redondea al más cercano, se vincula desde cero , mientras que IEEE 754 recomienda redondear al más cercano, incluso como el comportamiento predeterminado para las operaciones de punto flotante. Dichas modificaciones se dejan como ejercicio para el lector :)
fuente
Aquí hay uno simple
Usar como
alert(roundFloat(1.79209243929,4));
Jsfiddle
fuente
Redondea tu valor decimal, luego úsalo
toFixed(x)
para tus dígitos esperados.Llamada
parseDecimalRoundAndFixed (10.800243929,4) => 10.80 parseDecimalRoundAndFixed (10.807243929,2) => 10.81
fuente
Redondear a la baja
Redondeo
Ronda más cercana
fuente
fuente
Aquí está mi solución de 1 línea:
Number((yourNumericValueHere).toFixed(2));
Esto es lo que pasa:
1) Primero, se aplica
.toFixed(2)
al número que desea redondear los lugares decimales. Tenga en cuenta que esto convertirá el valor en una cadena desde el número. Entonces, si está utilizando Typecript, arrojará un error como este:"El tipo 'cadena' no se puede asignar al tipo 'número'"
2) Para recuperar el valor numérico o para convertir la cadena en un valor numérico, simplemente aplique la
Number()
función en ese llamado valor de 'cadena'.Para aclarar, mira el siguiente ejemplo:
EJEMPLO: Tengo una cantidad que tiene hasta 5 dígitos en decimales y me gustaría acortarla hasta 2 decimales. Lo hago así:
fuente
Ponga lo siguiente en un alcance global:
y luego intente :
Actualizar
Tenga en cuenta que
toFixed()
solo puede funcionar para la cantidad de decimales,0-20
es decir,a.getDecimals(25)
puede generar un error de JavaScript, por lo tanto, para adaptarse, puede agregar alguna verificación adicional, es decirfuente
esto devolverá un número aleatorio de 1 a 100 redondeado a 2 decimales.
fuente
Esto funcionó para mí: redondeando decimales en JavaScript
fuente
Usando esta respuesta por referencia: https://stackoverflow.com/a/21029698/454827
Construyo una función para obtener números dinámicos de decimales:
aquí ejemplo de trabajo: https://jsfiddle.net/wpxLduLc/
fuente
fuente
Con estos ejemplos, aún obtendrá un error cuando intente redondear el número 1.005, la solución es usar una biblioteca como Math.js o esta función:
fuente
Obtuve algunas ideas de esta publicación hace unos meses, pero ninguna de las respuestas aquí, ni las respuestas de otras publicaciones / blogs podrían manejar todos los escenarios (por ejemplo, números negativos y algunos "números de la suerte" que encontró nuestro probador). Al final, nuestro probador no encontró ningún problema con este método a continuación. Pegar un fragmento de mi código:
También tengo comentarios de código (lo siento, ya olvidé todos los detalles) ... Estoy publicando mi respuesta aquí para referencia futura:
fuente
Estoy arreglando el problema del modificador. Soporta solo 2 decimales.
fuente
Eso debería producir:
10.20
Eso debería producir:
0.05
Eso debería producir:
4.04
etc.
fuente
fuente
Esto es muy simple y funciona tan bien como cualquiera de los otros:
Como toFixed () solo se puede invocar en números, y desafortunadamente devuelve una cadena, esto hace todo el análisis por usted en ambas direcciones. ¡Puedes pasar una cadena o un número, y obtienes un número cada vez! Llamar a parseNumber (1.49) le dará 1, y parseNumber (1.49,2) le dará 1.50. ¡Como el mejor de ellos!
fuente
También puede usar el
.toPrecision()
método y algún código personalizado, y siempre redondear al enésimo dígito decimal independientemente de la longitud de la parte int.También podría convertirlo en un complemento para un mejor uso.
fuente
Tan simple como esto.
fuente
Encontré una manera muy simple que resolvió este problema para mí y puede usarse o adaptarse:
fuente
100% trabajando !!! Intentalo
fuente