Más aún, no es un problema de javascript sino una característica de los números binarios. No existe una representación binaria exacta de 1/10 al igual que en notación decimal no existe una representación exacta de 1/3 En cambos casos se obtienen fracciones periódicas.
Para solventar esto, es necesario hacer las divisiones como último paso, redondeando si es necesario a las cifras significativas. Hay otros lenguajes que lo solventan mediante el compilador, pero en el caso de que no suceda (FORTRAN, C -a veces-) es necesario emplear un parámetro epsilon que evite los errores de redondeo. Choan Gálvez escribió: > Hola. > > On 16/07/2007, at 15:00, Juan José Montes de Oca Arbós wrote: > >> Buenas a todos... a ver si alguno conoce una solución para el >> siguiente >> problema. >> >> Tanto en IE 6 como en FF2, al multiplicar 0.1 * 3 en lugar de >> devolverme 0.3devuelve >> 0.30000000000000004. >> >> Estuve leyendo varios articulos de internet, y encontré que es una >> problema >> en la forma de representar los números, y hay ejemplos que utilizando >> algunos tipos de datos en ciertos lenguajes se soluciona, pero en >> JS no >> encontré forma de solucionarlo... ¿alguien sabe como solucionarlo? > > > Lamentablemente no hay solución. Snif. > > Y efectivamente, el problema radica en la forma que tiene ECMAScript > de trabajar con números. Cito <http://www.thescripts.com/forum/ > post2022038-5.html> > > >>> > The problem is that Javascript is using 32 bits of data which have > 4294967296 different combinations to hold any value in the range > > 1.7976931348623158e+308 to 2.2250738585072014e–308 > > It does this by using a smaller presision value and using some of the > bits as a exponent (this can also be done in 16 bits with a smaller > range and less presision) which results in it being able to > approximate any value in the range but not exactly represent them all > (because in real number terms the are an infinaite number of values > between any 2 given values). > > As part of your calculcation clearly the internal representation of > the value is going outside the available presision (15 digits for a > 32 bit number but only 6 digits for a 16 digit number so perhaps > Javascript uses 16 bit floating point values) and you are ending up > with an approximation to the value instead of an exact value. > <<< > > Si conoces la precisión final que necesitas, puedes apañarte usando > Number.toFixed(n), usia > > (0.1 * 3).toFixed(1); > > Si no la conoces... mejor será que uses un lenguaje preciso si de > hacer cuentas precisas se trata. > > Salud. _______________________________________________ javaEScript mailing list [email protected] http://lists.scriptia.net/listinfo.cgi/javaescript-scriptia.net
