Aquí está el escenario: estoy recibiendo .9999999999999999
cuando debería estar recibiendo 1.0
.
Puedo permitirme perder un lugar decimal de precisión, así que estoy usando .toFixed(15)
, qué tipo de funciona.
El redondeo funciona, pero el problema es que me dan 1.000000000000000
.
¿Hay alguna manera de redondear a varios lugares decimales, pero eliminar los espacios en blanco adicionales?
Nota: .toPrecision
no es lo que quiero; Solo quiero especificar cuántos números después del punto decimal.
Nota 2: No puedo usar simplemente .toPrecision(1)
porque necesito mantener la alta precisión para los números que realmente tienen datos después del punto decimal. Idealmente, habría exactamente tantos lugares decimales como sea necesario (hasta 15).
javascript
math
floating-point
rounding
Nathan
fuente
fuente
Respuestas:
>>> parseFloat(0.9999999.toFixed(4)); 1 >>> parseFloat(0.0009999999.toFixed(4)); 0.001 >>> parseFloat(0.0000009999999.toFixed(4)); 0
fuente
-2.34.toFixed(1)
retorna-2.3
debido a la precedencia del operador .parseFloat
función:+number.toFixed(13)
esta expresión también se puede usar para eliminar imprecisiones de números de JavaScript como en 1.0000000000000045.Sí, hay una manera. Utilice
parseFloat()
.parseFloat((1.005).toFixed(15)) //==> 1.005 parseFloat((1.000000000).toFixed(15)) //==> 1
Vea un ejemplo en vivo aquí: http://jsfiddle.net/nayish/7JBJw/
fuente
parseFloat("0.0000007")
, lo que da"7e-7"
Según tengo entendido, desea eliminar los ceros finales en la cadena que obtuvo a través de
toFixed()
. Esta es una operación de cadena pura:var x = 1.1230000; var y = x.toFixed(15).replace(/0+$/, ""); // ==> 1.123
fuente
...replace(/\.?0+$/, "");
).0
convierte en la cadena vacía""
, y se-0
convierte en-
, ninguno de los cuales se espera (supongo). @ zach-snow su solución sugerida también falla en 0 y -0.Number(n.toFixed(15)) or +(n.toFixed(15))
convertirá la cadena decimal de 15 posiciones en un número, eliminando los ceros finales.fuente
Si lanza el valor de retorno a un número, esos ceros finales se eliminarán. Esto también es menos detallado de lo que
parseFloat()
es.+(4.55555).toFixed(2); //-> 4.56 +(4).toFixed(2); //-> 4
Este utiliza el operador unario + , por lo que si se utiliza esto como parte de una operación de cadena es necesario tener un infijo + antes de que:
var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));
. FYI un unario + delante de una cadena lo convierte en un Número. Desde MDN: Unary + puede:fuente
+(4.1).toFixed(4)
está4.1
en Chrome 60 .Ninguno de estos realmente me consiguió lo que estaba buscando según el título de la pregunta, que era, por ejemplo, que 5.00 fuera 5 y 5.10 fuera 5.1. Mi solución fue la siguiente:
num.toFixed(places).replace(/\.?0+$/, '') '5.00'.replace(/\.?0+$/, '') // 5 '5.10'.replace(/\.?0+$/, '') // 5.1 '5.0000001'.replace(/\.?0+$/, '') // 5.0000001 '5.0001000'.replace(/\.?0+$/, '') // 5.0001
Nota: la expresión regular solo funciona si
places > 0
PD https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
fuente
5e30
(cambia el número a5e3
). ¡Los casos de esquina son diabólicos!Hay un método mejor que mantiene la precisión y también elimina los ceros. Esto requiere un número de entrada y, a través de un poco de magia, sacará los ceros finales. Descubrí que 16 es el límite de precisión para mí, lo cual es bastante bueno si no colocas un satélite en Plutón.
function convertToFixed(inputnum) { var mynum = inputnum.toPrecision(16); //If you have a string already ignore this first line and change mynum.toString to the inputnum var mynumstr = mynum.toString(); return parseFloat(mynumstr); } alert(convertToFixed(6.6/6));
fuente
El
toFixed()
método formatea anumber
usando notación de punto fijo y devuelve astring
.Aplica una estrategia de redondeo a la mitad .
(0.124).toFixed(2); // returns 0.12 (0.125).toFixed(2); // returns 0.13
Como describió, de hecho también resultará en ceros finales (potencialmente innecesarios) a veces.
(0.001).toFixed(2); // returns 0.00
Es posible que no desee deshacerse de esos ceros finales, esencialmente podría convertirlo de nuevo a
number
. Hay muchas maneras de hacer esto.+(0.001).toFixed(2); // the shortest
Para obtener una descripción general de los diferentes métodos para convertir cadenas en números, consulte esta pregunta, que tiene excelentes respuestas.
fuente