2011-07-20 20 views
0

Javascript中的雙精度值例如爲1.0883076389305e-311。 我想表達它在下面的形式中,使用如實施例的「BC」實用程序以計算膨脹/更高的精度/鱗片狀:使用Javascript在非指數/簡寫形式中轉換/表示雙數

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

我需要一個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 
*/ 
相關問題