javascript - tag - title html w3schools
Eliminar los ceros finales insignificantes de un nĂºmero? (9)
¿Qué tal si multiplicamos por uno así?
var x = 1.234000*1; // becomes 1.234
var y = 1.234001*1; // stays as 1.234001
¿Me he perdido una llamada API estándar que elimina los ceros insignificantes finales de un número?
Ex.
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed () y Number.toPrecision () no son exactamente lo que estoy buscando.
Aquí hay una posible solución:
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
eval(x) --> 1.234
eval(y) --> 1.234001
Básicamente, tenía el mismo requisito y descubrí que no hay un mecanismo incorporado para esta funcionalidad.
Además de recortar los ceros finales, también tengo la necesidad de redondear y, opcionalmente, formatear la salida para la configuración regional actual del usuario (es decir, 123,456.789).
Todo mi trabajo en esto se ha incluido como prettyFloat.js (MIT Licensed) en GitHub: https://github.com/dperish/prettyFloat.js
Ejemplos de uso:
prettyFloat(1.111001, 3) // "1.111"
prettyFloat(1.111001, 4) // "1.111"
prettyFloat(1.1111001, 5) // "1.1111"
prettyFloat(1234.5678, 2) // "1234.57"
prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)
El método toFixed
hará el redondeo apropiado si es necesario. También agregará ceros finales, lo que no siempre es ideal.
(4.55555).toFixed(2);
//-> "4.56"
(4).toFixed(2);
//-> "4.00"
Si arroja el valor de retorno a un número, esos ceros finales se descartarán. Este es un enfoque más simple que hacer su propia matemática de redondeo o truncamiento.
+(4.55555).toFixed(2);
//-> 4.56
+(4).toFixed(2);
//-> 4
Necesitaba resolver este problema también cuando Django estaba mostrando valores de tipo Decimal en un campo de texto. Por ejemplo, cuando ''1'' era el valor. Mostraría ''1.00000000''. Si ''1.23'' fuera el valor, mostraría ''1.23000000'' (En el caso de una configuración ''decimal_places'' de 8)
Usar parseFloat no era una opción para mí, ya que es posible que no devuelva exactamente el mismo valor. toFixed no era una opción porque no quería redondear nada, así que creé una función:
function removeTrailingZeros(value) {
value = value.toString();
# if not containing a dot, we do not need to do anything
if (value.indexOf(''.'') === -1) {
return value;
}
# as long as the last character is a 0 or a dot, remove it
while((value.slice(-1) === ''0'' || value.slice(-1) === ''.'') && value.indexOf(''.'') !== -1) {
value = value.substr(0, value.length - 1);
}
return value;
}
Ninguna de estas soluciones funcionó para mí para números muy pequeños. http://numeraljs.com/ resolvió esto para mí.
parseFloat(0.00000001.toFixed(8));
// 1e-8
numeral(0.00000001).format(''0[.][00000000]'');
// "0.00000001"
Primero usé una combinación de matti-lyra y las respuestas de gary:
r=(+n).toFixed(4).replace(//.0+$/,'''')
Resultados:
- 1234870.98762341: "1234870.9876"
- 1230009100: "1230009100"
- 0.0012234: "0.0012"
- 0.1200234: "0.12"
- 0.000001231: "0"
- 0.10001: "0.1000"
- "asdf": "NaN" (entonces no hay error de tiempo de ejecución)
El caso algo problemático es 0.10001. Terminé usando esta versión más larga:
r = (+n).toFixed(4);
if (r.match(//./)) {
r = r.replace(//.?0+$/, '''');
}
- 1234870.98762341: "1234870.9876"
- 1230009100: "1230009100"
- 0.0012234: "0.0012"
- 0.1200234: "0.12"
- 0.000001231: "0"
- 0.10001: "0.1"
- "asdf": "NaN" (entonces no hay error de tiempo de ejecución)
Actualización : Y esta es la versión más nueva de Gary (ver comentarios):
r=(+n).toFixed(4).replace(/([0-9]+(/.[0-9]+[1-9])?)(/.?0+$)/,''$1'')
Esto da los mismos resultados que arriba.
Si lo convierte en una cadena, no mostrará los ceros al final, que no se almacenan en la variable en primer lugar desde que se creó como un Número, no como una Cadena.
var n = 1.245000
var noZeroes = n.toString() // "1.245"
Tuve una instancia similar en la que quería usar .toFixed()
cuando era necesario, pero no quería el relleno cuando no lo era. Así que terminé usando parseFloat junto con to Fixed.
ajustado sin relleno
parseFloat(n.toFixed(4));
Otra opción que hace casi lo mismo
Esta respuesta puede ayudar a su decisión
Number(n.toFixed(4));
toFixed
truncará / rellenará el número a una longitud específica, pero también lo convertirá en una cadena. Convertir eso de nuevo en un tipo numérico no solo hará que el número sea más seguro para usarlo aritméticamente, sino que también eliminará automáticamente cualquier 0 final. Por ejemplo:
var n = "1.234000";
n = parseFloat(n);
// n is 1.234 and in number form
Porque incluso si defines un número con ceros al final, se descartan.
var n = 1.23000;
// n == 1.23;