Skip to content

如何在JavaScript中指定对数的底数?

JavaScript的Math.log()Math.log2()Math.log10()函数分别用于计算以e210为底的对数。但是如果你想要计算一个数在不同底数下的对数,或者检查一个数是否是特定底数的幂,那么可以通过一些数学方法来实现。

计算一个数在特定底数下的对数

底数变换公式允许你通过将一个数的对数除以底数的对数来计算该数在特定底数下的对数。这意味着对于给定的底数b和一个数n,你可以使用公式Math.log(n) / Math.log(b)来计算n在底数b下的对数。

const logBase = (b, n) => Math.log(n) / Math.log(base);

logBase(5, 25); // 2
logBase(5, 625); // 4

通过使用部分应用,你可以创建一个函数,通过只传递底数作为参数来计算一个数在特定底数下的对数。这将返回一个新函数,该函数接受数作为参数,并计算指定底数下的对数。

const logBase = b => n => Math.log(n) / Math.log(base);

const logBase5 = logBase(5);

logBase5(25); // 2
logBase5(625); // 4

检查一个数是否是特定基数的幂

为了检查一个数是否是特定基数的幂,首先需要计算它在该基数下的对数。然后,可以使用取模运算符(%)来检查结果是否为整数。如果是整数,则该数是指定基数的幂,否则不是。

const isPowerOf10 = n => Math.log10(n) % 1 === 0;
const isPowerOf2 = n => Math.log2(n) % 1 === 0;
const isPowerOf = b => n => Math.log(n) / Math.log(b) % 1 === 0;

isPowerOf10(1); // true
isPowerOf10(10); // true
isPowerOf10(20); // false

isPowerOf2(1); // true
isPowerOf2(2); // true
isPowerOf2(3); // false

const isPowerOf5 = isPowerOf(5);

isPowerOf5(5, 25); // true
isPowerOf5(5, 625); // true
isPowerOf5(5, 20); // false

[!TIP]

尽量使用内置的对数函数,因为它们很可能比自定义实现更高效。