如何在JavaScript中指定Math.log()的基础?

Met*_*uru 198 javascript math logarithm

我需要一个logJavaScript函数,但它需要是基数10.我看不到任何列表,所以我假设它不可能.是否有任何数学向导知道这个解决方案?

Pet*_*ter 319

"基础变化"公式/身份

可以用以下标识计算对数10的对数的数值.

基数为10的对数


因为Math.log(x)在JavaScript中返回的自然对数x(与ln(x)相同),对于基数10,你可以除以Math.log(10)(与ln(10)相同):

function log10(val) {
  return Math.log(val) / Math.LN10;
}
Run Code Online (Sandbox Code Playgroud)

Math.LN10是一个内置的预计算常量Math.log(10),所以这个函数基本上与:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你不介意的话,添加一个带公式的图像并链接到维基百科. (14认同)
  • 每次计算Math.log(10)都很浪费.不必预先计算和存储,因为Math已定义此常量已经http://www.w3schools.com/jsref/jsref_ln10.asp (11认同)
  • 事实上,只要两个对数使用相同的基数,就可以使用任何基数,而不仅仅是*e*或2. (9认同)
  • 对于10以外的基数,向下滚动到[CMS的答案](http://stackoverflow.com/a/3019319/568458).如果向下滚动并阅读答案听起来很辛苦,基本原则是`return Math.log(n)/ Math.log(base);` (4认同)
  • 我注意到这里有一些潜在的错误空间,可能与浮点数学有关.我刚尝试了上面的函数,节点的值为1000,得到的结果是2.9999999999999996.(虽然我尝试过的其他数字,例如10,100甚至10000,都是正确的值.) (4认同)

bra*_*amp 64

简单,只需通过除以日志(10)来改变基数.甚至有一个常数来帮助你

Math.log(num) / Math.LN10;
Run Code Online (Sandbox Code Playgroud)

这与:

Math.log(num) / Math.log(10);
Run Code Online (Sandbox Code Playgroud)


CMS*_*CMS 51

您可以简单地除以值的对数和所需基数的对数,也可以覆盖Math.log方法以接受可选的基本参数:

Math.log = (function() {
  var log = Math.log;
  return function(n, base) {
    return log(n)/(base ? log(base) : 1);
  };
})();

Math.log(5, 10);
Run Code Online (Sandbox Code Playgroud)


Roy*_*hao 15

这里的答案会引起明显的精度问题,并且在某些用例中不可靠

> Math.log(10)/Math.LN10
1

> Math.log(100)/Math.LN10
2

> Math.log(1000)/Math.LN10
2.9999999999999996

> Math.log(10000)/Math.LN10
4
Run Code Online (Sandbox Code Playgroud)

  • 通过选择性舍入调整精度:`(Math.round(Math.log(1000)/ Math.LN10*1e6)/ 1e6) (8认同)

art*_*ung 13

Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}
Run Code Online (Sandbox Code Playgroud)

那你可以做

Math.log10(your_number);
Run Code Online (Sandbox Code Playgroud)

注意:最初我想这样Math.prototype.log10 = ...做,但用户CMS指出Math不能这样工作,所以我编辑了.prototype部分.

  • [`Math`](https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Math)是一个对象,而不是构造函数,因此它没有`prototype`属性. (3认同)
  • 只需删除`.prototype`部分;) (3认同)

Yuk*_*élé 13

const logBase = (n, base) => Math.log(n) / Math.log(base);
Run Code Online (Sandbox Code Playgroud)


Iva*_*ack 9

FF 25+支持一种Math.log10方法.您可以使用polyfill:

if (!Math.log10) Math.log10 = function(t){ return Math.log(t)/Math.LN10; };
Run Code Online (Sandbox Code Playgroud)

MDN列出了支持的浏览器.

桌面浏览器

Chrome    Firefox (Gecko) Internet Explorer   Opera   Safari
38        25 (25)         Not supported       25      7.1
Run Code Online (Sandbox Code Playgroud)

移动浏览器

Android         Chrome for Android    Firefox Mobile (Gecko)  IE Mobile      Opera Mobile    Safari Mobile
Not supported   Not supported         25.0 (25)               Not supported  Not supported   iOS 8
Run Code Online (Sandbox Code Playgroud)