2011-07-20 3 views
0

J'ai un double en Javascript dont la valeur est, par exemple, 1.0883076389305e-311. Je veux exprimer sous la forme suivante, en utilisant comme exemple le « bc » utilitaire pour calculer le élargi/précision/forme d'échelle supérieure:Convertir/exprimer un double nombre en non-exposant/forme courte en Javascript

$ bc 
scale=400 
1.0883076389305000*10^-311 
.0000000000000000000000000000000000000000000000000000000000000000000\ 
00000000000000000000000000000000000000000000000000000000000000000000\ 
00000000000000000000000000000000000000000000000000000000000000000000\ 
00000000000000000000000000000000000000000000000000000000000000000000\ 
00000000000000000000000000000000000000010883076389305000000000000000\ 
0000000000000000000000000000000000000000000000000000000000000 

je besoin d'une bibliothèque bigint code Javascript ou pour produire la même sortie comme une chaîne avec la forme développée/plus haute précision du nombre.

Merci!

+0

Combien de zéros devrait-il y avoir à la fin? – pimvdb

+0

Il peut y avoir une quantité infinie de zéros derrière, '0.01' est tout aussi correct que' 0.0100000000000000000000000000000 ... '. – pimvdb

Répondre

1

C'est horrible, mais fonctionne avec tous les cas de test, je peux penser à:

Number.prototype.toFullFixed = function() { 
    var s = Math.abs(this).toExponential(); 
    var a = s.split('e'); 
    var f = a[0].replace('.', ''); 
    var d = f.length; 
    var e = parseInt(a[1], 10); 
    var n = Math.abs(e); 

    if (e >= 0) { 
     n = n - d + 1; 
    } 

    var z = ''; 
    for (var i = 0; i < n; ++i) { 
     z += '0'; 
    } 

    if (e <= 0) { 
     f = z + f; 
     f = f.substring(0, 1) + '.' + f.substring(1); 
    } else { 
     f = f + z; 
     if (n < 0) { 
      f = f.substring(0, e + 1) + '.' + f.substring(e + 1); 
     } 
    } 

    if (this < 0) { 
     f = '-' + f; 
    } 

    return f; 
}; 

Si vous trouvez un numéro qui ne parse pas revenir correctement, à savoir n !== parseFloat(n.toFullFixed()), s'il vous plaît laissez-moi savoir ce qu'il est!

1

// Tant que vous faites affaire avec des chaînes de chiffres et non des numéros que vous pouvez méthodes de chaîne d'utiliser pour convertir l'ampleur exponentielle et la précision de zéros

function longPrecision(n, p){ 
    if(typeof n== 'string'){ 
     n= n.replace('*10', '').replace('^', 'e'); 
    } 
    p= p || 0; 
    var data= String(n), mag, str, sign, z= ''; 
    if(!/[eE]/.test(data)){ 
     return data; 
     if(data.indexOf('.')== -1 && data.length<p) data+= '.0'; 
     while(data.length<p) data+= '0'; 
     return data; 
    } 
    data= data.split(/[eE]/); 
    str= data[0]; 
    sign= str.charAt(0)== "-"? "-": ""; 
    str= str.replace(/(^[+-])|\./, ""); 
    mag= Number(data[1])+ 1; 
    if(mag < 0){ 
     z= sign + "0."; 
     while(mag++) z += "0"; 
     str= z+str; 
     while(str.length<p) str+= '0'; 
     return str; 
    } 
    mag -= str.length; 
    str= sign+str; 
    while(mag--) z += "0"; 
    str += z; 
    if(str.indexOf('.')== -1 && str.length<p) str+= '.0'; 
    while(str.length<p) str+= '0'; 
    return str; 
} 


var n='1.0883076389305000*10^-311'; 
longPrecision(n, 400); 


/* returned value: (String) 
0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001088307638930500000000000000000000000000000000000000000000000000000000000000000000000000 
*/ 
Questions connexes