2013-02-23 63 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