Puede haber cualquier número especificado, entonces quiero escribir una función para devolver el mejor número de límite superior para calcular el intervalo.
Para dividir el número en 5 intervalos, los mejores números son
Pero el número de entrada, no puede ser ese 5, 10, 25, 50, 100, 125, 500,...
Así que me gustaría escribir una función que pueda devolver el mejor número en negrita, pero ahora estoy atascado. Quiero calcular sobre la marcha. No hay valores predefinidos ya que no sé cuál sería el número de entrada. Para menos o igual a 10, puedo agregar más para manejar, pero más de 10, quiero pasar por algún cálculo de fórmula.
| aporte | producción |
|---|---|
| 8 | 10 |
| 13 | 25 |
| 110 | 125 |
| 456 | 500 |
| 1601 | 2000 |
| 53194 | 60000 |
¿Hay alguna fórmula para calcular para que pueda escribir la función que toma la entrada anterior y devuelve la salida? Muchas gracias.
La razón para no dividir 110 en 22, 44, 66, 88, 110, estos números no son adecuados para aparecer en el eje del gráfico excepto 2, 4, 6, 8, 10.
Sugiero definir su intervalo de alguna manera como esta:
Luego puede resolver las desigualdades resultantes tomando logaritmos y tomando la solución mínima viable para encontrar el intervalo.
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)); }Esto no coincide con su salida sugerida en todos los casos, pero proporciona valores razonables y consistentes. Puede ajustar los formularios que están permitidos si desea modificar esto.