js problema de precisión de cálculo

Al hacer cálculos con js, a menudo ocurren los siguientes problemas:

0.1 + 0.2 = 0.30000000000000004
0.3 - 0.2 = 0.09999999999999998
20.123/100 = 0.201230000000000000000002
2.425*100 = 2.424999999999997

IEEE 754 tipo de coma flotante de 64 bits
IEEE 754

IEEE 754 especifica cuatro formas de representar valores de punto flotante: precisión simple (32 bits), precisión doble (64 bits), precisión simple extendida (por encima de 43 bits, rara vez se usa) y precisión doble extendida (79 bits) Lo anterior generalmente se implementa en 80 bits).

El nombre completo de este estándar es IEEE Binary Floating Point Arithmetic Standard (ANSI / IEEE Std 754-1985), también conocido como IEC 60559: 1989, la aritmética binaria de coma flotante de los sistemas de microprocesador (el número original es IEC 559: 1989).
Número de coma flotante de precisión simple El
formato de número de coma flotante de precisión simple es un tipo de datos que ocupa 4 bits (32 bits) en la memoria de la computadora. Usando el método de "coma flotante" (coma decimal flotante), puede representar una amplia gama de valores.

En la definición de IEEE 754-2008, el formato base 2 de 32 bits se denomina oficialmente formato binary32. Este formato se define como simple en IEEE 754-1985, es decir, precisión simple. Cabe señalar que en algunos sistemas informáticos anteriores, también existen otros formatos de número de punto flotante de 4 bytes.

definición

El primer dígito indica positivo y negativo, los 8 dígitos del medio indican el exponente y los últimos 23 dígitos almacenan los dígitos efectivos (los dígitos efectivos son 24 dígitos).

Los ocho bits del medio pueden representar un total de 28 = 256 números, y el exponente puede ser el complemento a dos; o 0 a 255, 0 a 126 para -127 a -1, 127 para cero, 128-255 para 1-128.

El 1 más a la izquierda de los dígitos significativos no se almacenará porque debe existir (el primer dígito significativo del binario debe ser 1). En otras palabras, los dígitos efectivos son 24 bits y en realidad se almacenan 23 bits.

js problema de precisión de cálculo
Número de
punto flotante de doble precisión El número de punto flotante de doble precisión (doble) es un tipo de datos utilizado por las computadoras. En comparación con los números de punto flotante de precisión simple, los números de punto flotante de precisión doble (doble) utilizan 64 bits (8 bytes) para almacenar un número de punto flotante. Puede representar 15 o 16 dígitos significativos en el sistema decimal, y el rango de valor absoluto del número que puede representar es aproximadamente [2.23e-308,1.79e308]

definición

Similar a la precisión simple, el primer dígito representa positivo y negativo, los últimos 11 dígitos son dígitos exponentes y los últimos 52 dígitos representan precisión (los dígitos efectivos son 53 dígitos).

js problema de precisión de cálculo

0.1 / 0.2 bits binarios

(0.1) .toString (2) === "0.000 110011001100110011001100110011001100110011001100110 1"

(0.2) .toString (2) === "0.00 1100110011001100110011001100110011001100110011001101"

(0.30000000000000004) .toString (2) === "0.0100110011001100110011001100110011001100110011001101"

(0.3) .toString (2) === "0.010011001100110011001100110011001100110011001100110011"

Entonces, el 0.1 final en la representación binaria es 0.0001 1001 1001 1001 ..., pero miramos los últimos seis dígitos de (0.1) .toString () por encima de 001101, el ciclo normal debería ser 001100, por lo que después del truncamiento, el valor de la representación binaria 0.1 se vuelve más grande ! ! ! . 0.2 convertido a binario significa que también se vuelve más grande después del truncamiento.

Al comparar la representación binaria de 0.1, 0.2 y su suma, se puede encontrar que la longitud de la cadena ha cambiado, pero la precisión no ha cambiado, es decir, la longitud de la cadena desde 1 hasta el final es 52.

0.1 + 0.2 debe tener una longitud de 57, pero debido a que no puede representar tal número, contando desde el número que comienza desde 1 nuevamente, los últimos tres números se truncarán (la precisión final es 52 o 53)

Después de la adición de dígitos binarios, 0.1 + 0.2 se convierte en
0.0100 1100 .......... 1100111 total 57, y luego 54 del primer 1, pero el máximo es 53 dígitos, que serán truncados Se vuelve 52 o 53 y luego se vuelve más grande

Cabe señalar que los últimos dígitos almacenados en diferentes decimales son diferentes.

Se recomienda la solución específica para usar la biblioteca para resolver y luego estudiar la solución de la biblioteca.
Una solución más general es convertir decimales en números enteros y luego volver a decimales para resolver.
math.js bigNumber.js decimal.js number-precision se puede utilizar para resolver

Supongo que te gusta

Origin blog.51cto.com/13934921/2569895
Recomendado
Clasificación