出於興趣而非現實生活需求:是否有可能在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. Window.innerheight在javascript中減去數字
- 3. 在JavaScript中減去帶符號整數
- 4. Javascript,不能減去數值
- 5. JavaScript減去日期
- 6. Python:在數組中減去
- 7. IE8在JavaScript/jQuery中減去錯誤?
- 8. 如何在JavaScript中減去小時?
- 9. 在javascript中減去不透明度
- 10. 減去兩個char指針
- 11. Javascript:100%減去像素
- 12. 如何用Javascript減去ISOdates
- 13. javascript減去兩次彼此
- 14. 從其減去的javascript次
- 15. 減去兩個日期變量並在javascript中獲得天數
- 16. 如何在Javascript中減去對象內的小時數
- 17. 如何減去日期日期在JavaScript
- 18. 減去軍用時間在JavaScript
- 19. 減去R中
- 20. 減去在python
- 21. 減去數據php
- 22. php減去數據
- 23. 減去Numpy數組
- 24. 減去PHP數組
- 25. 如何減去數組/陣列減去數組的數組 - PERL
- 26. 在sql中使用餘數減去
- 27. 如何在PHP中減去分鐘數?
- 28. 在Java中減去兩倍
- 29. 在XMLGregorianCalendar中減去一天
- 30. 在php中減去時間
您可能會發現這個問題有趣的:http://stackoverflow.com/questions/9383593/extracting-the-exponent-and-mantissa-of-a-javascript-number – 2013-02-23 00:38:25