我有一个号码,我需要将它舍入到最近的十次幂。看起来这应该是可能的,没有一大堆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秒左右评论了当前链接的问题,由没有阅读整个问题并仅仅评论抱怨它是重复的人发表评论。那个人已经删除了他的评论(在意识到他错了之后),虽然你可以看到自己和其他人的评论都指出这不是重复。
答案 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)
您可以通过以下方式执行此操作
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;
答案 4 :(得分:0)
f = n => +("1"+"0".repeat((""+n).length-1));
或:
f = n => +(""+n).split("").map((_,i)=>i?"0": "1").join("");