出于兴趣而非现实生活需求:是否有可能在JavaScript中减去两个数字的指数?因为1e+29 * 1e-3
(或1e+29/1e+3
)的结果是非正规数9.999999999999999e+25
,即使正确结果1e+26
可以用JavaScript表示。在JavaScript中减去指数
2
A
回答
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
相关问题
- 1. Kibana减去2个指数
- 2. 在JavaScript中减去带符号整数
- 3. 如何在JavaScript中减去小时?
- 4. IE8在JavaScript/jQuery中减去错误?
- 5. 如何用Javascript减去ISOdates
- 6. 从其减去的javascript次
- 7. Javascript:100%减去像素
- 8. 如何在Javascript中减去对象内的小时数
- 9. 如何减去日期日期在JavaScript
- 10. 减去在python
- 11. 减去R中
- 12. 减去数据php
- 13. 减去PHP数组
- 14. php减去数据
- 15. 减去Numpy数组
- 16. 如何在PHP中减去分钟数?
- 17. 在php中减去时间
- 18. 在MySQL中减去值表
- 19. 在Django中减去日期?
- 20. 在Java中减去两倍
- 21. 显示指标减去状态栏?
- 22. 减去在MySQL列
- 23. 从输入数组中减去数字
- 24. 逻辑:从整数中减去整数
- 25. 如何从数组中减去数组?
- 26. matlab从数组中减去数组
- 27. 如何使用javascript减去数组中的值
- 28. Javascript函数从div中减去不起作用。
- 29. 如何用javascript函数从div中减去50px?
- 30. 从结构中的数组中减去
您可能会发现这个问题有趣的:http://stackoverflow.com/questions/9383593/extracting-the-exponent-and-mantissa-of-a-javascript-number – 2013-02-23 00:38:25