Domanda

Devo arrotondare i numeri decimali a sei posizioni utilizzando JavaScript, ma devo considerare i browser legacy, quindi posso non fare affidamento su Number.toFixed

  

Il grande problema con toExponential, toFixed e toPrecision è che sono costrutti abbastanza moderni non supportati in Mozilla fino a Firefox versione 1.5 (sebbene IE supportasse i metodi dalla versione 5.5). Mentre è principalmente sicuro usare questi metodi, i browser più vecchi si romperanno, quindi se stai scrivendo un programma pubblico è consigliabile fornire i tuoi prototipi per fornire funzionalità per questi metodi per browser più vecchi.

Sto pensando di usare qualcosa di simile

Math.round(N*1000000)/1000000

Qual è il metodo migliore per fornire questo prototipo ai browser più vecchi?

È stato utile?

Soluzione

Prova questo:

if (!Number.prototype.toFixed)

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

Altri suggerimenti

Penso che Firefox 1.5 e IE 5 non siano praticamente più utilizzati o da un numero molto limitato di persone.
È un po 'come la codifica per supportare Netscape Navigator ... :-)
A meno che qualche altro browser importante (Opera? Safari? Improbabile ...) non supporti questo, o se i tuoi registri Web mostrano molto utilizzo del browser legacy, probabilmente puoi semplicemente usare questi metodi.
A volte, dobbiamo andare avanti. ^ _ ^

[EDIT] Funziona bene su Opera 9.50 e Safari 3.1

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

L'articolo a cui fai riferimento è un anno e mezzo fa, un'eternità nel settore IT ... Penso che, a differenza degli utenti di IE, gli utenti di Firefox passino spesso all'ultima versione.

Da sito web dei byte , questa funzione è quasi lo stesso di 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);
  }
}

Un'altra opzione è (che non converte inutilmente in una stringa e corregge anche il calcolo errato di (162.295) .toFixed (2) a 162.29 (dovrebbe essere 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 */

Modifica: quando provi questa specifica incarnazione, this * = Math.pow (10, precision || 0) crea un errore nell'assegnazione della mano sinistra non valida. Quindi ha dato a questa parola chiave la variabile a . Sarebbe anche utile se chiudessi le mie funzioni ^ _ ^ ;;

Prova questo:

 Number.prototype.toFixed = function(precision) {
     var power = Math.pow(10, precision || 0);
     return String(Math.round(this * power)/power);
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top