轮数降至最接近的十次幂

时间:2017-10-08 16:20:05

标签: javascript

我有一个号码,我需要将它舍入到最近的十次幂。看起来这应该是可能的,没有一大堆if语句或使用递归或循环,但我不知道最优雅的方法。如果我不清楚我的意思,这里有一些例子:

f(1) === 1
f(5) === 1
f(15) === 10
f(43) === 10
f(456) === 100
f(999) === 100

澄清:我不需要10的最接近倍数(不是:10,20,30 ......),而是最接近10的幂(10,100,1000 ......)。

编辑:据我所知,这不是一个重复的问题。请停止关闭作为问题的副本,询问有关舍入到最近的多个十的问题。这个问题与链接的问题无关,因为它要求舍入到最近的 power 十。如果您想将此问题作为副本关闭,请查找并链接重复的问题。在我发布问题后30秒左右评论了当前链接的问题,由没有阅读整个问题并仅仅评论抱怨它是重复的人发表评论。那个人已经删除了他的评论(在意识到他错了之后),虽然你可以看到自己和其他人的评论都指出这不是重复。

5 个答案:

答案 0 :(得分:11)

你可以取10的对数,取整数值10的幂。



function f(v) {
    return Math.pow(10, Math.floor(Math.log10(v)));
}

console.log(f(1));   //   1
console.log(f(5));   //   1
console.log(f(15));  //  10
console.log(f(43));  //  10
console.log(f(456)); // 100
console.log(f(999)); // 100




答案 1 :(得分:2)

只需获取数字的长度(通过将数字转换为字符串),然后通过获取10(指数为length - 1)的幂来生成结果。

function generateNum(v) {
  return Math.pow(10, v.toString().length - 1);
}



var data = [1, 5, 15, 43, 456, 456, 999];


data.forEach(function(v) {
  console.log(generateNum(v));
})

function generateNum(v) {
  return Math.pow(10, v.toString().length - 1);
}




仅供参考:如果数字包含小数部分,则需要通过取底值来避免小数部分。

function generateNum(v) {
  return Math.pow(10, Math.floor(v).toString().length - 1);
}

答案 2 :(得分:1)

以下是适用于负数的变体:

let round10 = v => Math.pow(10, Math.floor(Math.log10(Math.abs(v)))) * Math.pow(-1, v < 0);

答案 3 :(得分:0)

您可以通过以下方式执行此操作

&#13;
&#13;
function f(num){
    let count = 0;
    while(num > 1){
        count ++;
        num/= 10;
    }
    return Math.pow(10, count-1) * (Math.round(num) ? 10: 1);
}

console.log(f(453));
&#13;
&#13;
&#13;

答案 4 :(得分:0)

f = n => +("1"+"0".repeat((""+n).length-1));

或:

f = n => +(""+n).split("").map((_,i)=>i?"0": "1").join("");