analizar
JavaScript tiene solo un número de tipo de número, y todos los números en JavaScript están representados en el formato estándar IEEE-754. El problema de precisión de los números de punto flotante no es exclusivo de JavaScript, porque algunos decimales representan dígitos infinitos en binario:
Binario decimal
0.1 0.0001 1001 1001 1001 ...
0.2 0.0011 0011 0011 0011 ...
0.3 0.0100 1100 1100 1100 ...
0.4 0.0110 0110 0110 0110 ...
0.5 0.1
0.6 0.1001 1001 1001 1001 ...
Entonces, por ejemplo, 1.1, su programa en realidad no puede representar '1.1', pero solo puede lograr un cierto grado de precisión.
1.0999999999999999999
El problema en JavaScript es más complicado, aquí hay solo algunos datos de prueba en Chrome:
Entrada y salida
1.0-0.9 == 0.1 falso
1.0-0.8 == 0.2 Falso
1.0-0.7 == 0.3 falso
1.0-0.6 == 0.4 Verdadero
1.0-0.5 == 0.5 Verdadero
1.0-0.4 == 0.6 Verdadero
1.0-0.3 == 0.7 Verdadero
1.0-0.2 == 0.8 Verdadero
1.0-0.1 == 0.9 Verdadero
resolver
Entonces, ¿cómo evitar este tipo de problema con no bug con 1.0-0.9! = 0.1? Aquí hay una solución que se usa actualmente con más frecuencia.
La copia del código es la siguiente:
(1.0-0.9) .tofixed (dígitos) // tofixed () Los parámetros de precisión deben estar entre 0 y 20
parsefloat ((1.0-0.9) .tofixed (10)) === 0.1 // El resultado es verdadero
parsefloat ((1.0-0.8) .tofixed (10)) === 0.2 // El resultado es verdadero
parsefloat ((1.0-0.7) .tofixed (10)) === 0.3 // El resultado es verdadero
parsefloat ((11.0-11.8) .tofixed (10)) === -0.8 // El resultado es verdadero
Método de refinación
La copia del código es la siguiente:
// use el método de la herramienta ISEqual para determinar si los valores son iguales o no
función isequal (número1, número2, dígitos) {
dígitos = dígitos == Undefinado?
return number1.tofixed (dígitos) === número2.tofixed (dígitos);
}
isEqual (1.0-0.7, 0.3);
// Método de extensión nativa, prefiera el estilo orientado a objetos
Número.prototype.isequal = function (número, dígitos) {
dígitos = dígitos == Undefinado?
devuelve this.tofixed (dígitos) === Number.tofixed (dígitos);
}
(1.0-0.7) .isequal (0.3);