En Javascript cuando hago las siguientes adiciones:
console.log(42.458333333333336+21) console.log(42.458333333333336+22)Esperaba que esto saliera:
63.458333333333336 64.458333333333336Pero no lo hace, sale:
63.458333333333336 64.45833333333334¿Qué pasa con eso entonces?
La diferencia en la visualización se debe al formato predeterminado de JavaScript de los números de punto flotante . JavaScript usa suficientes dígitos para distinguir de forma única el número de los valores representables adyacentes.
Cuando 42.458333333333336 aparece en el código fuente, se convierte al valor más cercano representable en el formato Number , que es 42.45833333333333570180911920033395290374755859375.
Sumar 21 a esto produce 63.458333333333333570180911920033395290374755859375. El siguiente Number más alto es 63.458333333333342807236476801335811614990234375. Si estos se redondearon a 16 dígitos decimales significativos, tendrían el mismo resultado, 63.4583333333333. Entonces, JavaScript redondea su resultado a 17 dígitos para distinguirlo, produciendo "63.458333333333336".
Cuando se suma 22 a 42.458333333333333570180911920033395290374755859375, el resultado es 64.458333333333342807236476801335811614990234375. Tenga en cuenta que esto pasó de 64, por lo que el exponente utilizado para representarlo en punto flotante de base dos ha aumentado. Eso significa que pierde algo de precisión absoluta. El resultado se redondeó para ajustarse al formato de punto flotante, por lo que la parte de la fracción cambió. El siguiente Number más bajo es 64.4583333333333285963817615993320941925048828125. Para estos dos números, solo se necesitan 16 dígitos significativos para distinguirlos, porque se redondean a 64.45833333333334 y 64.45833333333333. Entonces JavaScript produce "64.45833333333334".