2013-02-23 51 views
2

出於興趣而非現實生活需求:是否有可能在JavaScript中減去兩個數字的指數?因爲1e+29 * 1e-3(或1e+29/1e+3)的結果是非正規數9.999999999999999e+25,即使正確結果1e+26可以用JavaScript表示。在JavaScript中減去指數

+1

您可能會發現這個問題有趣的:http://stackoverflow.com/questions/9383593/e​​xtracting-the-exponent-and-mantissa-of-a-javascript-number – 2013-02-23 00:38:25

回答

0

必須是做的更清潔的方式,而是一個選擇是你的電話號碼轉換爲字符串,就可以進行操作,然後將其轉換回數字:

function exp_add(num,exp) { 
    var split = num.toExponential().split('e'); 
    var exponent = parseInt(split[1],10); 
    exponent += exp; 
    return parseFloat(split[0] + "e" + exponent); 
} 

工作示例在jsFiddle

0

您可以使用Math.log(1e29)/Math.LN10,但是收益率爲28.999999999999993。基數2對於這些數字只是不精確的。所以我們最後的手段是Number.prototype.toString,正確產生"1e29"。我們現在怎麼用?

function toExp(num) { 
    return num.toExponential().split("e").map(Number); 
    // num.toString() only works for num <= 1e-6 and num >= 1e21 
} 
function fromExp(exp) { 
    return exp[0] * Math.pow(10, exp[1]); 
// or:  parseFloat(exp[0]+"e"+exp[1]); 
} 

function expMultiply(a, b) { 
    return [ a[0]*b[0], a[1]+b[1] ]; 
} 
function expDivide(a, b) { 
    return [ a[0]/b[0], a[1]-b[1] ]; 
} 

> fromExp(expMultiply(toExp(1e29), toExp(1e-3))) 
1e+26 
> fromExp(expDivide(toExp(1e29), toExp(1e3))) 
1e+26 
0

你自然會認爲這是浮點除法的結果,尤其是當一個數比另一個要小得多。但是,如果這些數字具有相同的基數,那麼也許應該只存儲它們的指數。否則,你可以使用對數:

(Math.log(1e29) + Math.log(1e-3))/Math.LN10 
> 25.999999999999993 

你可能只想一輪結果幾個小數照顧不準確的,並在基地得到結果10