El método funciona claramente con números enteros, por ejemplo
(25).toString(2) = '11001' (25).toString(16) = '19' (25).toString(36) = 'p'Pero ingresar flotantes da como resultado
(0.1).toString(2) = '0.0001100110011001100110011001100110011001100110011001101' (0.1).toString(16) = '0.1999999999999a' (0.1).toString(36) = '0.3lllllllllm'Se dice que V8 es un motor de código abierto. Sin embargo, no puedo encontrar la implementación exacta de este método en el repositorio para poder entenderlo. ¿Cómo maneja la función los flotadores?
(Desarrollador V8 aquí.)
El enlace de @pilchard es correcto; más específicamente, la función que está buscando es DoubleToRadixCString .
La observación de que 0.1 (decimal) es una fracción no terminante en su representación binaria (que es, por supuesto, cómo se almacenan los dobles dentro de las computadoras) es una buena ilustración de la razón subyacente por la que 0.1 * 3 == 0.30000000000000004 : la no las fracciones terminales necesariamente se cortan en algún punto, lo que constituye un error de redondeo, y algunas operaciones hacen visibles estos errores de redondeo. Es el equivalente binario de un efecto similar en decimal: cuando representa 1/3 como "0.333333" (eligiendo arbitrariamente 6 dígitos como la longitud representada, pero si solo corta después de 100 dígitos, eso realmente no cambiaría nada), y multiplica eso por 3, obtienes "0.999999", no 1.