优化javascript数字函数

优化javascript数字函数,javascript,optimization,methods,numbers,Javascript,Optimization,Methods,Numbers,我的目标是使用javascript获得最底层的数字。例如: // 23 -> 20; // 234 -> 230; // 2345 -> 2300; ... 我正在使用下一个函数: var usersCount = 23; var rounded; if (usersCount < 100) { rounded = Math.floor(usersCount / 10) * 10; } else if (usersCount < 1000) { r

我的目标是使用javascript获得最底层的数字。例如:

// 23 -> 20;
// 234 -> 230;
// 2345 -> 2300;
...
我正在使用下一个函数:

var usersCount = 23;
var rounded;
if (usersCount < 100) {
    rounded = Math.floor(usersCount / 10) * 10;
} else if (usersCount < 1000) {
    rounded = Math.floor(usersCount / 100) * 100;
} else if (usersCount < 10000) {
    rounded = Math.floor(usersCount / 1000) * 1000;
} else if (usersCount < 100000) {
    rounded = Math.floor(usersCount / 10000) * 10000;
} else if (usersCount < 1000000) {
    rounded = Math.floor(usersCount / 100000) * 100000;
} else {
    rounded = usersCount;
}
var userscont=23;
var四舍五入;
如果(用户搜索<100){
四舍五入=数学楼层(UserScont/10)*10;
}否则如果(用户搜索<1000){
四舍五入=数学楼层(UserScont/100)*100;
}否则如果(用户流量<10000){
四舍五入=数学楼层(用户单位/1000)*1000;
}否则如果(用户流量<100000){
四舍五入=数学楼层(用户单位/10000)*10000;
}否则如果(用户流量<1000000){
四舍五入=数学楼层(用户单位/100000)*100000;
}否则{
四舍五入=用户查询;
}

我需要将该功能改进为动态的,以避免放置其他ifs或任何类型的开关。我该怎么做?有没有更好的方法来达到预期的效果?

您可以使用如下函数:

constusercount=234567;
const roundIt=n=>{
常数numberLength=Math.ceil(Math.log10(n+1));
常数减少=n>100?2:1;
返回Math.floor(n/Math.pow(10,numberLength-递减))*Math.pow(10,numberLength-递减);
};
//显示用户计数
document.querySelector(“.user count”).innerHTML=userCount;
//显示四舍五入计数
document.querySelector(“.user count rounded”).innerHTML=roundIt(userCount)

用户计数:0
四舍五入用户计数:0

您可以使用字符串的长度来计算乘数,方法是:

const round=s=>{
设c=Math.pow(10,s.toString().length-1);
返回数学楼层(s/c)*c;
};
[
23,
199,
888,
99999,
100001
].forEach(x=>{
控制台日志(圆形(x));

});我现在能想到的最简洁、最优化的重新编写代码的方法如下:

let usersCount = 23;
let rounded;
let x = 10 ** (usersCount.toString().length - 1);
rounded = Math.floor(usersCount / x) * x;

它应该按照您的要求递归工作,没有任何限制。

以下函数再现了示例中给出的行为:

function f(x) {
    var m, u;
    m = Math.floor(Math.log10(x));
    u = Math.pow(10, Math.max(1, m - 1));
    return u * Math.floor(x / u);
}
如果您愿意四舍五入到2个有效数字,您可以使用

function f(x) {
    return Number.parseFloat(x.toPrecision(2));
}

你的例子不相符。你不想把
234
四舍五入到
200
,把
2345
四舍五入到
2000
?另外,你真的想四舍五入(例如
27
=>
30
)还是真的把数字降到最低?或者干脆
Math.pow(10,x.toString().length)
。无需从数组中创建数字字符串,然后对其进行解析。@Bergi当然,您完全正确,谢谢!我已相应地更新了我的答案。
function f(x) {
    return Number.parseFloat(x.toPrecision(2));
}