analisar
O JavaScript possui apenas um número de tipo de número e todos os números no JavaScript são representados no formato padrão IEEE-754. O problema de precisão dos números de ponto flutuante não é exclusivo do JavaScript, porque alguns decimais representam dígitos infinitos em binário:
Binário 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 ...
Por exemplo, 1.1, seu programa não pode realmente representar '1.1', mas só pode obter um certo grau de precisão.
1.09999999999999999999
O problema em JavaScript é mais complicado, aqui estão apenas alguns dados de teste no Chrome:
Entrada e saída
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 Verdadeiro
1.0-0.5 == 0,5 Verdadeiro
1.0-0.4 == 0,6 Verdadeiro
1.0-0.3 == 0,7 Verdadeiro
1.0-0.2 == 0,8 Verdadeiro
1.0-0.1 == 0,9 Verdadeiro
resolver
Então, como evitar esse tipo de problema não-bug com 1,0-0,9! = 0,1? Aqui está uma solução que atualmente é usada com mais frequência.
A cópia do código é a seguinte:
(1.0-0.9) .tofixado (dígitos) // tofixed () Os parâmetros de precisão devem estar entre 0 e 20
parsefloat ((1.0-0.9) .tofixado (10)) === 0.1 // O resultado é verdadeiro
parsefloat ((1.0-0.8) .tofixado (10)) === 0.2 // O resultado é verdadeiro
parsefloat ((1.0-0.7) .tofixado (10)) === 0.3 // O resultado é verdadeiro
parsefloat ((11.0-11.8) .tofixado (10)) === -0.8 // O resultado é verdadeiro
Refino do método
A cópia do código é a seguinte:
// Use o método da ferramenta isEqual para determinar se os valores são iguais ou não
função isequal (número1, número2, dígitos) {
Digits = Digits == indefinido?
retornar number1.tofixed (dígitos) === Number2.tofixed (dígitos);
}
isEqual (1,0-0.7, 0,3);
// Método de extensão nativa, prefira o estilo orientado a objetos
Número.prototype.isequal = function (número, dígitos) {
Digits = Digits == indefinido?
retornar este.tofixado (dígitos) === número.tofixado (dígitos);
}
(1.0-0.7) .EsEqual (0,3);