如何检查浮点数是否是另一个数的整数幂

时间:2018-04-13 18:52:45

标签: javascript algorithm data-structures

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(它应该true10^-2 = 0.01)。

2 个答案:

答案 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