Pregunta

Necesito redondear los números decimales a seis lugares usando JavaScript, pero debo considerar los navegadores heredados, así que puedo no confíe en Number.toFixed

  

El gran problema con toExponential, toFixed y toPrecision es que son construcciones bastante modernas que no son compatibles con Mozilla hasta la versión 1.5 de Firefox (aunque IE admite los métodos desde la versión 5.5). Si bien es más seguro usar estos métodos, los navegadores más antiguos se romperán, por lo que si está escribiendo un programa público, se recomienda que proporcione sus propios prototipos para proporcionar la funcionalidad de estos métodos para navegadores más antiguos.

Estoy considerando usar algo como

Math.round(N*1000000)/1000000

¿Cuál es el mejor método para proporcionar este prototipo a navegadores antiguos?

¿Fue útil?

Solución

Prueba esto:

if (!Number.prototype.toFixed)

    Number.prototype.toFixed = function(precision) {
        var power = Math.pow(10, precision || 0);
        return String(Math.round(this * power)/power);
    }

Otros consejos

Creo que Firefox 1.5 e IE 5 ya casi no se usan, o por una cantidad muy pequeña de personas.
Es un poco como la codificación para admitir Netscape Navigator ... :-)
A menos que algún otro navegador importante (Opera? Safari? Improbable ...) no sea compatible con esto, o si sus registros web muestran mucho uso del navegador heredado, probablemente pueda usar estos métodos.
En algún momento, tenemos que seguir adelante. ^ _ ^

[EDITAR] Funciona bien en Opera 9.50 y Safari 3.1

javascript: var num = 3.1415926535897932384; alert(num.toFixed(7));

El artículo al que hace referencia hace un año y medio, una eternidad en la industria de TI ... Creo que, a diferencia de los usuarios de IE, los usuarios de Firefox suelen ir a la última versión.

De sitio web de bytes , esta función es casi lo mismo que Serge llinsky:

if (!num.toFixed) 
{
  Number.prototype.toFixed = function(precision) 
  {
     var num = (Math.round(this*Math.pow(10,precision))).toString();
     return num.substring(0,num.length-precision) + "." + 
            num.substring(num.length-precision, num.length);
  }
}

Otra opción es (que no se convierte en una cadena innecesariamente, y también corrige el error de cálculo de (162.295) .toFixed (2) a 162.29 (debería ser 162.30)).

Number.prototype._toFixed=Number.prototype.toFixed; //Preserves the current function
Number.prototype.toFixed=function(precision){
/* step 1 */ var a=this, pre=Math.pow(10,precision||0);
/* step 2 */ a*=pre; //currently number is 162295.499999
/* step 3 */ a = a._toFixed(2); //sets 2 more digits of precision creating 16230.00
/* step 4 */ a = Math.round(a);
/* step 5 */ a/=pre;
/* step 6 */ return a._toFixed(precision);
}
/*This last step corrects the number of digits from 162.3 ( which is what we get in
step 5 to the corrected 162.30. Without it we would get 162.3 */

Editar: Al intentar esta encarnación específica, this * = Math.pow (10, precision || 0) crea un error de asignación de mano izquierda no válida. Entonces le dio a esta palabra clave la variable a . También ayudaría si cerrara mis funciones ^ _ ^ ;;

Prueba esto:

 Number.prototype.toFixed = function(precision) {
     var power = Math.pow(10, precision || 0);
     return String(Math.round(this * power)/power);
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top