在JavaScript中如何指定Math.log()的底数?

223

我需要一个JavaScript的log函数,但它必须是以10为底数的。我没有找到任何这样的列表,所以我假设这不可能实现。有没有数学巫师知道解决方案?


6
自ECMAScript 2015以来,就有一个Math.log10()方法供后来者使用。 - Haggra
10个回答

352

"底数变换"公式/恒等式

计算以10为底的对数的数值可以使用以下恒等式。

以10为底的对数


由于JavaScript中的Math.log(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);
}

11
事实上,任何基数都可以使用,不仅限于e或2,只要两个对数使用相同的基数即可。 - Joey
16
如果您不介意,我已添加了一个带有公式的图像,并链接到维基百科。 - Anurag
16
每次计算Math.log(10)是浪费的。由于Math已经定义了这个常量,因此预先计算和存储是不必要的。http://www.w3schools.com/jsref/jsref_ln10.asp - Michael Kariv
5
对于除了10以外的进制,请往下滚动到CMS的回答。如果滚动并阅读答案听起来很费力,基本原理是 return Math.log(n) / Math.log(base); - user56reinstatemonica8
4
我注意到这里可能存在一些潜在的错误,可能与浮点数运算有关。我刚尝试在节点中使用上述函数并输入1000的值,结果得到了2.9999999999999996的结果。(尽管我尝试了其他数字,如10、100和甚至10000,它们的计算结果是正确的。) - user4815162342
显示剩余4条评论

71

很简单,只需通过除以log(10)来更改底数。甚至有一个常数可以帮助您。

Math.log(num) / Math.LN10;

这与以下代码等价:

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

55

你可以将你的值的对数除以所需基数的对数,另外你也可以覆盖 Math.log 方法以接受一个可选的基数参数:

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

Math.log(5, 10);

27

17

这里的答案会导致明显的精度问题,在某些使用情况下不可靠。

> 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

13
使用有选择的四舍五入调整精度: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6) - Shane Daniel

16
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}
那么您可以执行以下操作
Math.log10(your_number);

注意: 最初我认为可以通过 Math.prototype.log10 = ... 来实现这个功能,但是用户 CMS 指出了 Math 不支持这种方式,因此我删除了 .prototype 部分。


3
Math 是一个对象,而不是构造函数,因此它没有 prototype 属性。 - Christian C. Salvadó
谢谢 CMS。这证明了在感到“灵感”之前应该先测试事物。我会回到草稿纸上。 - artlung
3
去掉.prototype即可 ;) - Christian C. Salvadó

9

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

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

MDN 列出了支持的浏览器

Desktop Browsers

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

Mobile Browsers

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

2

Math.log10(x)

对于任意基数,顶部答案都是可以的,但问题涉及以 10 为底的对数,而 Math.log10(x) 自 2015 年起已成为所有浏览器的标准。*

*除了 IE,如果那对您很重要。

最初的回答:


0
如果你有一个数字x,那么使用Math.log(x)本质上就是lnx。
要将其转换为除e以外的其他底数,可以使用以下函数:
function(x){ return Math.log(x)/Math.log(10); }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接