我的目标是使用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;
}
我需要将该功能改进为动态的,以避免放置其他if或任何类型的开关。我怎样才能做到这一点?我有更好的方法来获得想要的结果吗?
答案 0 :(得分:1)
您可以使用如下功能:
const userCount = 234567;
const roundIt = n => {
const numberLength = Math.ceil(Math.log10(n + 1));
const decrease = n > 100 ? 2 : 1;
return Math.floor(n / Math.pow(10, numberLength - decrease)) * Math.pow(10, numberLength - decrease);
};
// Display user count
document.querySelector(".user-count").innerHTML = userCount;
// Display rounded count
document.querySelector(".user-count-rounded").innerHTML = roundIt(userCount);
<h1>
User count: <span class="user-count">0</span>
</h1>
<h1>
Rounded user count: <span class="user-count-rounded">0</span>
</h1>
我们使用数字的长度,并使用与您编写的相同的代码四舍五入。
答案 1 :(得分:0)
您可以使用字符串的长度通过Math.pow计算乘数:
const usersCount = 23;
const round = s => {
let c = Math.pow(10, s.toString().length - 1);
return Math.floor(s / c) * c;
};
console.log(round(usersCount)); // 20
const round = s => {
let c = Math.pow(10, s.toString().length - 1);
return Math.floor(s / c) * c;
};
[
23,
199,
888,
99999,
100001
].forEach(x => {
console.log(round(x));
});
答案 2 :(得分:0)
我现在想到的最紧凑,最优化的方式来重新编写代码如下:
let usersCount = 23;
let rounded;
let x = 10 ** (usersCount.toString().length - 1);
rounded = Math.floor(usersCount / x) * x;
它应以递归方式工作,不受您的限制。
答案 3 :(得分:0)
以下函数重现了示例中给出的行为:
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);
}
如果您愿意舍入为两个有效数字,可以使用
function f(x) {
return Number.parseFloat(x.toPrecision(2));
}