我想根据以下条件将自定义舍入到接近 0.05。这很难解释,但下面的例子很容易理解。
12.910 - 12.90
12.920 - 12.90
12.930 - 12.90
12.940 - 12.90
12.941 - 12.95
12.950 - 12.95
12.960 - 12.95
12.970 - 12.95
12.980 - 12.95
12.990 - 12.95
12.991 - 13.00
13.000 - 13.00
我尝试了几个函数,但它正在将 12.98 向上舍入到 13.00。
function customRound( num) {
return Math.round(num * 20) / 20;
}
最佳答案
从视觉上看,您的舍入算法看起来像这样:
点是您要在该间隔内舍入到的位置。 ( 表示区间的开放端,] 表示区间的封闭端。(12.99 属于红色区间。)我们将通过操纵线来实现此算法以匹配 Math.floor
的。
首先,我们来处理整数。
num * 100
您的舍入区间是左开右闭,但 Math.floor
是左闭右开。我们可以通过乘以 −1 来翻转直线以匹配:
num * 100 * -1
⇒ num * -100
舍入区间的长度是 5,所以我们需要将区间的末端放在 5 的倍数上...
num * -100 - 1
...在除以 5 以匹配 Math.floor
之前。
(num * -100 - 1 ) / 5
⇒ num * -20 - 0.2
现在我们可以发言了。
return Math.floor(num * -20 - 0.2);
通过乘以 5 返回到原来的比例:
return Math.floor(num * -20 - 0.2) * 5;
通过添加 4 将返回值移到点:
return Math.floor(num * -20 - 0.2) * 5 + 4;
取消我们之前做的对齐:
return Math.floor(num * -20 - 0.2) * 5 + 4 + 1;
⇒ return Math.floor(num * -20 - 0.2) * 5 + 5;
撤消翻转:
return (Math.floor(num * -20 - 0.2) * 5 + 5) * -1;
⇒ return Math.floor(num * -20 - 0.2) * -5 - 5;
然后将整个值除以 100 得到原来的比例:
return (Math.floor(num * -20 - 0.2) * -5 - 5) / 100;
⇒ return Math.floor(num * -20 - 0.2) * -0.05 - 0.05;
使用 Robin Zigmond 的测试框架,
function customRound(num) {
return Math.floor(num * -20 - 0.2) * -0.05 - 0.05;
}
// test desired results
var tests = [12.91, 12.92, 12.93, 12.94, 12.941, 12.95, 12.96, 12.97, 12.98, 12.99, 12.991, 13];
for (var i=0; i<tests.length; i++) {
console.log(`${tests[i].toFixed(3)} - ${customRound(tests[i]).toFixed(2)}`);
}
关于javascript - 自定义四舍五入到最接近的 0.05,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53198773/