0,1 + 0,2 === 0,3?

Objetivo: compreender o problema descrito pelo título

  1. Resposta: Diferente.
  2. IEEE 754 pode representar apenas 1/2, 1/4, não 1/10

O armazenamento binário de 0,1 e 0,2 no computador fará com que percam um certo grau de precisão, e seu armazenamento binário no computador não é mais o real 0,1 e 0,2 quando convertido em decimal, e o resultado da adição naturalmente não é 0,3.

Como converter 0,1 em binário

0,1 * 2 = 0,2 leva o inteiro 0
0,2 * 2 = 0,4 leva o inteiro 0
0,4 * 2 = 0,8 leva o inteiro 0
0,8 * 2 = 1,6 leva o inteiro 1
0,6 * 2 = 1,2 leva o inteiro 1
, etc.

5.5 Como converter para binário

5.5 Converter para binário =====> 101.1 Notação científica =====> 1.011 * 2 ^ 2
Salvar no computador:
Bit de sinal: 0
Bit expoente: 2 mais 1023 =====> 1025 Converter para binário == = ==> 10000000001
dígito da mantissa: 1,011 oculta o 1 à esquerda da vírgula decimal =====> 011

Como resolver erros de ponto flutuante

1. Julgamento

É impossível lidar com decimais infinitos em um espaço limitado, então para julgamentos, use toPrecision + parseFloat

// 一般精度12就够了
function strip(num, precision = 12) {
  return +parseFloat(num.toPrecision(precision));
}

2. Operação

  1. Obtenha precisão (use toFixed para resolver (nota: 1.005.toFixed (2) === 1.00, não 1.01)
  2. Adicione strings.
  3. A biblioteca de terceiros usa bignumber. js resolve, mas o desempenho é um pouco pior.

Por que seja a = 0,1, a é igual a 0,1

Se um número de ponto flutuante de precisão dupla IEEE 754 for convertido em uma string de número decimal contendo pelo menos 17 dígitos significativos, quando a string for convertida de volta para um número de ponto flutuante de precisão dupla, ele deve ser igual ao número original ; em outras palavras, se um número de ponto flutuante de precisão dupla for convertido em um número decimal, desde que o número de ponto flutuante de precisão dupla que ele retorna não mude, a precisão mais curta servirá.

Tome 0,1 como exemplo.O armazenamento de 0,1 e 0,10000000000000001 convertido em números de ponto flutuante de precisão dupla é o mesmo, portanto, o 0,1 mais curto servirá.

O método Number.prototype.toPrecision ()
toPrecision () retorna a representação de string do objeto numérico com a precisão especificada.

Number (100) .toString (2) -> '1100100' Conversão decimal
var num = 1100100;
console.log (parseInt (num, 2));

Como armazenar números de ponto flutuante iEEE 754

  1. Armazenamento de dupla precisão, 1 bit de sinal + 11 bits de expoente + 52 bits de mantissa
  2. Valores máximos e mínimos.
  3. Máximo seguro e mínimo seguro.
  4. Fórmula de conversão

Nota

Por que 1.005.toFixed (2) = 1.00 em vez de 1.01

1.005.toPrecision (6) = == 1.00499

//通过isEqual工具方法判断数值是否相等
function isEqual(number1, number2, digits){
    
    
  digits = digits == undefined? 10: digits; // 默认精度为10
  return number1.toFixed(digits) === number2.toFixed(digits);
}
console.log(isEqual(1.0-0.7, 0.3));  //true
//原型扩展方式,更喜欢面向对象的风格
Number.prototype.isEqual = function(number, digits){
    
    
  digits = digits == undefined? 10: digits; // 默认精度为10
  return this.toFixed(digits) === number.toFixed(digits);
}
console.log((1.0-0.7).isEqual(0.3)); //true

Qual é o significado de Number.MAX_VALUE e Number.MAX_SAFE_INTEGER?

Os inteiros seguros não serão distorcidos.

Resumindo

Para números de ponto flutuante, eles podem basicamente resolver os problemas encontrados em geral.

Citando artigos

Falando sobre o princípio de números de ponto flutuante de JavaScript e grandes números que o front-end do
site
deve saber

Acho que você gosta

Origin blog.csdn.net/a519991963/article/details/114634338
Recomendado
Clasificación