我需要一个log
JavaScript 函数,但它需要以 10 为基数。我看不到任何列表,所以我假设它是不可能的。是否有任何数学向导知道解决方案?
10 回答
“改变基础”公式/身份
以 10 为底的对数数值可以用以下恒等式计算。
由于在 JavaScript 中返回(与ln(x)相同)Math.log(x)
的自然对数,因此以 10 为底,您可以除以(与ln(10)相同):x
Math.log(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);
}
很简单,只需通过除以 log(10) 来更改基数。甚至还有一个常数可以帮助你
Math.log(num) / Math.LN10;
这与以下内容相同:
Math.log(num) / Math.log(10);
您可以简单地将值的对数和所需基数的对数相除,也可以覆盖该Math.log
方法以接受可选的基数参数:
Math.log = (function() {
var log = Math.log;
return function(n, base) {
return log(n)/(base ? log(base) : 1);
};
})();
Math.log(5, 10);
这里的答案会导致明显的精度问题,并且在某些用例中不可靠
> 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
Math.log10 = function(n) {
return (Math.log(n)) / (Math.log(10));
}
然后你可以做
Math.log10(your_number);
注意:最初我想这样Math.prototype.log10 = ...
做,但用户CMS指出数学不是这样工作的,所以我编辑了这.prototype
部分。
const logBase = (n, base) => Math.log(n) / Math.log(base);
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
Math.log10(x)
!
最佳答案适用于任意基数,但问题是关于以 10 为基数的日志,并且自 2015 年以来Math.log10(x)
一直是所有浏览器的标准。 *
* IE 除外,如果出于某种原因这对您很重要。
以 10 为基数使用Math.log10()
。
参见文档:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10
如果你有一个数字 x,那么使用的Math.log(x)
本质上就是 lnx。
要将其转换为 e 以外的基数,可以使用以下函数:
function(x){ return Math.log(x)/Math.log(10); }