Quiero limitar el número a un máximo de 5 dígitos redondeando el decimal. Si tenemos menos de 5 dígitos, el número debe permanecer intacto. ¿Alguien podría ayudarme a escribir esa función?
function limitAndRoundNumber(number) { ... }Entradas y salidas ejemplares:
limitAndRoundNumber(1.234) should return 1.234 (unchanged because number has less than 5 digits) limitAndRoundNumber(1.234567) should return 1.2346 limitAndRoundNumber(12.34567) should return 12.346 limitAndRoundNumber(123.4567) should return 123.46 limitAndRoundNumber(1234.567) should return 1234.6 limitAndRoundNumber(12345) should return 12345El número de entrada puede ser mayor que 0 y menor que 100000
Tiendo a usar lo siguiente para reducir un número a un número determinado de decimales
Math.round(number * multiplier) / multiplierDonde 'multiplicador' es 10 a la potencia del número de decimales. Ahora solo necesita averiguar cuál debe ser el multiplicador, y puede hacerlo redondeando a un valor entero y obteniendo la longitud de cadena del número. Entonces algo como:
function limitAndRoundNumber(number) { const wholeDigits = Math.round(number).toString().length; const power = wholeDigits <= 5 ? 5 - wholeDigits : 0; const multiplier = 10**power; return Math.round(number * multiplier) / multiplier; } console.log(limitAndRoundNumber(1.23)); console.log(limitAndRoundNumber(1.234567)); console.log(limitAndRoundNumber(12.34567)); console.log(limitAndRoundNumber(123.4567)); console.log(limitAndRoundNumber(1234.567)); console.log(limitAndRoundNumber(12345)); console.log(limitAndRoundNumber(123456));Una solución es convertir el número en una cadena y usar String.slice(0,requiredLength) para ajustar la longitud antes de devolver una versión numérica de la cadena.
La longitud dependería de si el número contenía un separador decimal, que podría determinarse mediante un condicional dentro de la función.
Fragmento de trabajo:
function limitAndRoundNumber(number) { const length = (number.toString().indexOf('.')) ? 6 : 5; return parseFloat(number.toString().slice(0,length)); } console.log(limitAndRoundNumber(1.234567)); console.log(limitAndRoundNumber(12.34567)); console.log(limitAndRoundNumber(123.4567)); console.log(limitAndRoundNumber(1234.567)); console.log(limitAndRoundNumber(12345)); console.log(limitAndRoundNumber(12)); console.log(limitAndRoundNumber(12.3));La función podría modificarse para permitir cualquier longitud, al incluir un argumento de longitud y hacer referencia a él en la prueba del operador ternario para el separador decimal:
length = (number.toString().indexOf('.')) ? length+1 : length;