将数字四舍五入为最合适的最接近数字,以便我可以计算出 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个区间,最好的数字是

  1. 如果小于等于5 = 分成1,2,3,4,5
  2. if 10 => 分成 2, 4, 6, 8, 10
  3. if 25 => 分成 5, 10, 15, 20, 25
  4. if 50 => 分成 10, 20, 30, 40, 50
  5. if 100 => 分为 20, 40, 60, 80, 100
  6. if 125 => 分为 25, 50, 75, 100, 125
  7. 如果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,这些数字不适合出现在图表轴上。

我建议像这样定义间隔:

For a positive input number n, find the minimum interval i such that 5i >= n and i is one of the following forms: 10^k, 2(10^k), 5(10^k), or 25(10^k), where k is a non-negative integer

然后您可以通过取对数来求解由此产生的不等式,并采用最小可行解来求出区间。

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));
}

这并非在所有情况下都符合您建议的输出,但确实提供了合理且一致的值。如果你想调整这个,你可以调整允许的形式。