Tengo 2 listas de selección en html, lugar para ingresar un número y segundo lugar para mostrar el resultado. Funciona como una conversión, por lo que cuando eliges milímetros de la primera lista y metros de la segunda, te mostrará el número que ingresaste x 0.001. No hay problema con los números pequeños (hasta 9 dígitos; puedo redondearlos), pero cuando trato de hacer 1 milímetro a 1 yoctómetro (1.0 × 10 -21 milímetros) a veces es correcto, a veces no. Si agrego ceros al yoctómetro, a veces mostrará algo como 0.1 + 0.2 = 0.30000000000000004. El problema es que no puedo redondearlo, porque alguien puede ingresar como 1000 yoctómetros y no funcionará. ¿Hay alguna manera de arreglar esto? (mira milímetros -> centímetros, Math.pow)
const config = { "milimeters": { "milimeters": v => v * 1, /* this is only an example */ "centimeters": v => v * Math.pow(10, -21), "decimeters": v => v * 0.01, "meters": v => v * 0.001, "dekameters": v => v * 0.0001, "hectometers": v => v * 0.00001, "kilometers": v => v * 0.000001, "inches": v => v * 0.0393700787, "feet": v => v * 0.0032808399, "yards": v => v * 0.0010936133, "miles": v => v * 0.000000621371192, }, } function calculate() { const listFromV = document.getElementById("listFrom").value; const listToV = document.getElementById("listTo").value; const inputPlace = parseFloat(document.getElementById("inputPlace").value); const fn = config[listFromV][listToV]; document.getElementById("resultPlace").innerHTML = fn(inputPlace); if (document.getElementById("inputPlace").value == "") { document.getElementById("resultPlace").innerHTML = "0.00"; } };Editar:
1 * Math.pow(10, -21) = 1.0000000000000001e-21 /* not correct */ 1000 * Math.pow(10, -21) = 1e-18 /* correct */ 10 * Math.pow(10, -29) = 1.0000000000000001e-28 /* not correct */ 100 * Math.pow(10, -29) = 1e-27 /* correct */Así que hay una manera (gracias a Eric Postpischil).
v => Number((v * Math.pow(10, -21)).toPrecision(15))Funciona como debería (.toPrecision(15) es el número máximo que funciona bien) y permite hasta 14 dígitos después del punto
1 * Math.pow(10, -21) = 1.0000000000000001e-21 /* before */ Number((1 * Math.pow(10, -21)).toPrecision(15)) = 1e-21 /* now */