将数字四舍五入为最合适的最接近数字,以便我可以计算出 2、5 或 10 的间隔
Rounded number to a best suitable nearest number so that i can calculate the interval thats are factor of 2, 5 or 10
可以指定任意个数,那我想写个函数给return最好的上限数来计算区间
把数字分成5个区间,最好的数字是
- 如果小于等于5 = 分成1,2,3,4,5
- if 10 => 分成 2, 4, 6, 8, 10
- if 25 => 分成 5, 10, 15, 20, 25
- if 50 => 分成 10, 20, 30, 40, 50
- if 100 => 分为 20, 40, 60, 80, 100
- if 125 => 分为 25, 50, 75, 100, 125
- 如果500 => 分成100, 200, 300, 400, 500
但是输入的数字,不能是5,10,25,50,100,125,500,...
所以我想写一个函数,可以 return 最好的粗体数字,但我现在卡住了。我想即时计算。没有预定义值,因为我不知道输入数字是多少。
小于或等于10,我可以添加额外处理,但大于10,我想通过一些公式计算。
input
output
8
10
13
25
110
125
456
500
1601
2000
53194
60000
是否有任何计算公式,以便我可以编写接受上述输入和 return 输出的函数?非常感谢。
之所以不把110拆分成22、44、66、88、110,除了2、4、6、8、10,这些数字不适合出现在图表轴上。
我建议像这样定义间隔:
然后您可以通过取对数来求解由此产生的不等式,并采用最小可行解来求出区间。
function interval(n, steps=5) {
// Find the minimum x such that x = a*b^k >= n / steps, where k is an integer
const solve = (a, b) => a * b ** Math.ceil(Math.log((n / steps) / a) / Math.log(b));
// Return the lowest of the possible solutions
return Math.min(
solve(1, 10),
solve(2, 10),
solve(5, 10),
solve(25, 10)
);
}
// alternatively const interval = (n, steps=5) => Math.min(...[1, 2, 5, 25].map(a => a * 10 ** Math.ceil(Math.log10((n / steps) / a))));
const inputs = [5, 8, 13, 110, 456, 1601, 53194];
console.log("input\t int\t limit");
for (const n of inputs) {
console.log(n, '\t', interval(n), '\t', 5 * interval(n));
}
这并非在所有情况下都符合您建议的输出,但确实提供了合理且一致的值。如果你想调整这个,你可以调整允许的形式。
可以指定任意个数,那我想写个函数给return最好的上限数来计算区间
把数字分成5个区间,最好的数字是
- 如果小于等于5 = 分成1,2,3,4,5
- if 10 => 分成 2, 4, 6, 8, 10
- if 25 => 分成 5, 10, 15, 20, 25
- if 50 => 分成 10, 20, 30, 40, 50
- if 100 => 分为 20, 40, 60, 80, 100
- if 125 => 分为 25, 50, 75, 100, 125
- 如果500 => 分成100, 200, 300, 400, 500
但是输入的数字,不能是5,10,25,50,100,125,500,...
所以我想写一个函数,可以 return 最好的粗体数字,但我现在卡住了。我想即时计算。没有预定义值,因为我不知道输入数字是多少。 小于或等于10,我可以添加额外处理,但大于10,我想通过一些公式计算。
input | output |
---|---|
8 | 10 |
13 | 25 |
110 | 125 |
456 | 500 |
1601 | 2000 |
53194 | 60000 |
是否有任何计算公式,以便我可以编写接受上述输入和 return 输出的函数?非常感谢。
之所以不把110拆分成22、44、66、88、110,除了2、4、6、8、10,这些数字不适合出现在图表轴上。
我建议像这样定义间隔:
然后您可以通过取对数来求解由此产生的不等式,并采用最小可行解来求出区间。
function interval(n, steps=5) {
// Find the minimum x such that x = a*b^k >= n / steps, where k is an integer
const solve = (a, b) => a * b ** Math.ceil(Math.log((n / steps) / a) / Math.log(b));
// Return the lowest of the possible solutions
return Math.min(
solve(1, 10),
solve(2, 10),
solve(5, 10),
solve(25, 10)
);
}
// alternatively const interval = (n, steps=5) => Math.min(...[1, 2, 5, 25].map(a => a * 10 ** Math.ceil(Math.log10((n / steps) / a))));
const inputs = [5, 8, 13, 110, 456, 1601, 53194];
console.log("input\t int\t limit");
for (const n of inputs) {
console.log(n, '\t', interval(n), '\t', 5 * interval(n));
}
这并非在所有情况下都符合您建议的输出,但确实提供了合理且一致的值。如果你想调整这个,你可以调整允许的形式。