2011-07-20 10 views
0

値が例えば1.0883076389305e-311のJavascriptで二重になっています。 Iが展開/高精度/スケール形状を計算するために、一例として「BC」ユーティリティを使用して、次の形式でそれを表現したい:Javascriptで非指数/短い形式の倍数を変換/表現する

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

Iは、同じ出力を生成するためのJavaScript BIGINTライブラリまたはコードを必要とします数値の拡張/高精度形式の文字列として返されます。

ありがとうございます!

+0

ゼロに指数関数的に大きさと精度を変換するには? – pimvdb

+0

無限のゼロが後ろに来ることがあります。「0.01」は '0.0100000000000000000000000000000 ... 'とまったく同じです。 – pimvdb

答えて

1

これは恐ろしいですが、私は考えることができるすべてのテストケースで動作します:あなたが正しく戻って解析しない番号を見つけた場合は

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; 
}; 

、すなわちn !== parseFloat(n.toFullFixed())、私はそれが何であるかを教えてください!

1

//限り、あなたが数字ではなく、あなたが 使用文字列のメソッドできる数の文字列を扱っていると終わりがあるはずどのように多くのゼロ

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 
*/ 
関連する問題