zator online ieee754 formato conversion calculadora arithmetic javascript binary ieee-754

javascript - online - Por qué console.log muestra solo una parte del número resultante de 0.1+0.2=0.30000000000000004



ieee 754 online conversion (2)

¡Esta pregunta no fue hecha en stackoverlow todavía! No estoy preguntando por qué 0.1 + 0.2 no es igual a 0.3, ¡estoy pidiendo cosas muy diferentes! Por favor, lea la pregunta antes de marcarla como un duplicado.

Escribí esta función que muestra cómo JavaScript almacena números flotantes en 64 bits:

function to64bitFloat(number) { var f = new Float64Array(1); f[0] = number; var view = new Uint8Array(f.buffer); var i, result = ""; for (i = view.length - 1; i >= 0; i--) { var bits = view[i].toString(2); if (bits.length < 8) { bits = new Array(8 - bits.length).fill(''0'').join("") + bits; } result += bits; } return result; }

Ahora quiero verificar si el resultado de 0.1+0.2 está realmente almacenado como se muestra en la consola 0.30000000000000004 . Entonces hago lo siguiente:

var r = 0.1+0.2; to64bitFloat(r);

El número resultante es:

0 01111111101 0011001100110011001100110011001100110011001100110100

Ahora, convirtámoslo en el binario:

Experto calculado:

01111111101 = 1021 1021 - 1023 = -2

Obtener todo junto,

1.0011001100110011001100110011001100110011001100110100 x 2 ** -2 = 0.010011001100110011001100110011001100110011001100110100

Ahora, si convertimos el número resultante en decimal usando este convertidor , obtenemos:

0.3000000000000000444089209850062616169452667236328125

¿Por qué la consola no muestra el número completo, en lugar de solo dígitos más significativos?


El método console.log no es estándar. En Firefox, puede especificar el número de decimal con un especificador de formato

console.log(''%.60f'', 0.1 + 0.2)

da

0.300000000000000044408920985006261616945266723632812500000000

Que es el mismo número que el dado por tu convertidor.

Tenga en cuenta que esto no funciona en Chrome.

En conclusión:

  • El número de Javascript se almacena con el formato binario IEEE 754-2008 de doble precisión y 64 bits.
  • La representación de cadenas de un número se define en el estándar ECMAScript .
  • El método console.log depende del navegador y la implementación de Firefox permite especificar un número arbitrario de lugares decimales para mostrar los números.

En realidad, no tienes que escribir una pregunta tan larga. Lo que podrías hacer es abrir la consola y escribir:

var a = 0.3000000000000000444089209850062616169452667236328125;

console.log (a);

eso aún le daría un resultado - 0.30000000000000004 (al menos en la consola Google Chrome).

Y la razón por la que es así, es porque las limitaciones de JS, que solo permiten mostrar 16 caracteres de un flotador. Puede leer más en respuesta a esta pregunta: https://.com/a/19613321/3014041