Quiero verificar si un valor decimal es mayor o igual al valor más bajo de 0.05
Ejemplo
Value | Expected Nearest 0.05 value 11.10 | 11.05 11.11 | 11.10 11.12 | 11.10 11.13 | 11.10 11.14 | 11.10 11.15 | 11.10Intenté usar la fórmula
parseFloat((Math.floor(value * 20) / 20).toFixed(2))Pero falla para 11.10 y 11.15. Usando la fórmula anterior, obtengo el mismo resultado que el valor, pero los valores esperados son diferentes. ¿Qué fórmula debo usar para corregir los casos de prueba anteriores?
Puede multiplicar los valores por 100 para eliminar temporalmente los dos puntos decimales necesarios, el número más cercano ahora se convierte en un múltiplo de 5, luego puede eliminar el resto de la división euclidiana por 5 y obtener lo que desea.
Y dado que un múltiplo exacto de 5 debe llevarse al valor inferior más cercano, puede eliminar condicionalmente un 5 cuando el resto es igual a 0.
La función de fórmula podría ser algo como:
const f = (v) => (((Math.floor(v*100) - (Math.floor(v*100) % 5 || 5)) / 100).toFixed(2)); console.log('11.10', f(11.10)); console.log('11.11', f(11.11)); console.log('11.12', f(11.12)); console.log('11.13', f(11.13)); console.log('11.14', f(11.14)); console.log('11.15', f(11.15));Puede tomar una compensación y tomar un valor de piso múltiple.
const format = f => Math.floor((f - 0.01) * 20) / 20; console.log([11.10, 11.11, 11.12, 11.13, 11.14, 11.15, 11.16, 11.17, 11.18, 11.19].map(format)); .as-console-wrapper { max-height: 100% !important; top: 0; }Si mi manera es la más eficiente, no estoy seguro, pero así es como lo haría:
var x = Math.floor(value * 100); var remainder = x % 5; if (remainder == 0) { // deal with dropping down the 11.10 to 11.05 remainder = 5 } var result = parseFloat((x - remainder) / 100).toFixed(2);SIN EMBARGO, esto solo funciona para valores que tienen 2 decimales: para tener en cuenta el tercer decimal, debe modificarlo para:
var x = value * 100; var remainder = x % 5; if (remainder == 0) { // deal with dropping down the 11.10 to 11.05 remainder = 5 } var result = parseFloat((x - remainder) / 100).toFixed(2);Lo que entiendo de su pregunta es que desea el valor más bajo más cercano y la respuesta debe ser menor que el valor en sí. Entonces, siendo n el número del que necesita el múltiplo más bajo y siendo v el valor, tal vez pueda intentar algo como:
const nearestMultiple = (v) => (Math.floor((v - 0.001) /n) * n).toFixed(2); La fórmula básica para encontrar un múltiplo sería Math.floor((v/n) * n) , pero para su caso único, no queremos que la función devuelva el número dado, por lo tanto, se resta 0.001.