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


204

我需要一个log用于JavaScript 的函数,但它必须以10为基础。我看不到任何相关的清单,因此我假设这是不可能的。是否有任何数学向导对此有解决方案?


2
自ECMAScript 2015起,就有一种Math.log10()方法供以后使用的人使用。
哈格拉

Answers:


329

“基础更改”公式/标识

以10为底的对数的数值可以用以下标识计算。

以10为底的对数


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

function log10(val) {
  return Math.log(val) / Math.LN10;
}

Math.LN10是的内置预计算常量Math.log(10),因此该函数实质上与以下内容相同:

function log10(val) {
  return Math.log(val) / Math.log(10);
}

10
实际上,只要两个对数使用相同的底数,就可以使用任何底数,而不仅仅是e或2。
乔伊2010年

16
如果您不介意,则添加带有公式的图像并链接到Wikipedia。
阿努拉格2010年

13
每次浪费计算Math.log(10)的时间。由于Math已经定义了此常数,因此无需预先计算和存储w3schools.com/jsref/jsref_ln10.asp
Michael Kariv 2012年

4
对于10以外的底数,向下滚动到CMS的答案。如果向下滚动并阅读答案听起来像是艰苦的工作,则基本原理是return Math.log(n) / Math.log(base);
user56reinstatemonica8

4
我注意到这里存在一些潜在的错误空间,可能与浮点数学有关。我刚刚尝试了上面的函数,在节点中的值为1000,结果为2.9999999999999996。(尽管我尝试了其他数字,例如10、100甚至10000,但得出的值正确。)
user4815162342

64

容易,只需除以log(10)即可更改基数。甚至还有一个常量可以帮助您

Math.log(num) / Math.LN10;

与以下内容相同:

Math.log(num) / Math.log(10);

52

您可以简单地将值的对数与所需底数的对数相除,也可以重写此Math.log方法以接受可选的底数参数:

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

Math.log(5, 10);

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

8
通过选择取整来调整精度: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel


13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

那你可以做

Math.log10(your_number);

注意:最初我想这样Math.prototype.log10 = ...做,但是CMS用户指出Math不能以这种方式工作,因此我编辑了该.prototype零件。


3
Math是一个对象,而不是构造函数,因此它没有prototype属性。
CMS 2010年

感谢CMS。证明一个人应该在感到“启发”之前先测试一下。我将回到绘图板。
artlung 2010年

3
只需移除.prototype零件;)
CMS 2010年

9

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

if (!Math.log10) Math.log10 = function(t){ return Math.log(t)/Math.LN10; };

MDN列出了受支持的浏览器

桌面浏览器

Chrome    Firefox (Gecko) Internet Explorer   Opera   Safari
38        25 (25)         Not supported       25      7.1

移动浏览器

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


0

如果您有数字x,请使用 Math.log(x)本质上就是lnx。

要将其转换为e以外的基数,可以使用以下函数:

function(x){ return Math.log(x)/Math.log(10); }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.