function checkIfNumberIsPower(n,power) {
if(n == 0) {
return 0;
}
var count = 0;
while(n != 1)
{
console.log("hi")
if(n % power != 0) {
return false;
}
n = n / power;
count++;
}
console.log(count)
return true;
}
var numb = 0.01;
var power = 10;
var numbCheck = checkIfNumberIsPower(numb,power);
console.log("numb is...."+numbCheck );
我正在尝试检查数字是否为10的幂。如果numb不是浮点数,它可以正常工作,但是当我检查0.01
之类的浮点数时,它返回false
(它应该true
为10^-2 = 0.01
)。
答案 0 :(得分:4)
为了防止浮点算术的精度陷阱,你可以用功率存储所需的乘法或除法的方向,并检查该值是否达到1。
为了防止无限循环,通过使用方向依赖检查进行另一次检查,如果值进入不需要的方向则退出。此结果可能会被解释为不执行。
对于非零的所有其他值,将返回功率值。
function checkIfNumberIsPower(n, power) {
var count = 0,
direction = n < 1;
if (!n) {
return 'zero';
}
while (n !== 1) {
if (direction) {
n *= power;
count--;
} else {
n /= power;
count++;
}
if (direction ? n > 1 : n < 1) {
return 'missing precision or not power';
}
}
return count;
}
console.log(checkIfNumberIsPower(0.01, 10));
console.log(checkIfNumberIsPower(1000, 10));
console.log(checkIfNumberIsPower(1001, 10));
console.log(checkIfNumberIsPower(8, 2));
console.log(checkIfNumberIsPower(0.125, 2));
console.log(checkIfNumberIsPower(4, 3));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:2)
检查整数是否容易。因此,为了检查浮点数,我们可以反转数字,然后调用整数检查。由于精度有限,这可能仍会导致某些浮点值的错误结果,但只要不需要太多数字就可以工作。
function checkIfNumberIsPowerInt(n, power) {
var count = 0;
while(n != 1)
{
if(n % power != 0) {
return false;
}
n /= power;
count++;
}
return true;
}
function checkIfNumberIsPower(n, power) {
if(n === 1) { // for all x, x^0 = 1
return true;
}
if(!n) { // for no x, x^y = 0
return false;
}
if(Math.abs(n) > 0 && Math.abs(n) < 1) {
return checkIfNumberIsPowerInt(1 / n, power);
}
return checkIfNumberIsPowerInt(n, power);
}
console.log(checkIfNumberIsPower(0.01, 10)); // 10^-2 = 0.01
console.log(checkIfNumberIsPower(0.01, -10)); // -10^-2 = 0.01
console.log(checkIfNumberIsPower(-0.1, -10)); // -10^-1 = -0.1
console.log(checkIfNumberIsPower(-0.01, -10)); // -10^-2 =/= -0.01