Excel - Por que essa verificação de igualdade está falhando?

1

Estou usando o Excel para verificar extratos bancários importados. Um dos testes que uso é para garantir que a coluna de saldo seja igual ao saldo anterior mais o valor da linha. Em todas as circunstâncias até agora funcionou, mas com este conjunto específico de valores, parece falhar:

O conteúdo da célula é o seguinte:

A1: 11474.97
A2: -10781.34
A3: =A1+A2
A4: 693.63
A5: =A3=A4

Estou usando o Office 16.0.6965.2117. Isso é um bug, ou estou faltando alguma coisa fundamental sobre como o operador de igualdade funciona?

    
por rudivonstaden 15.03.2017 / 09:42

2 respostas

2

Como os números iniciais são muito maiores do que o resultado, você irá se deparar com a perda de precisão devido ao ponto flutuante IEEE 754 O Excel usa a Precisão dupla IEEE 754 .

Não vou aprofundar os detalhes, mas sim ilustrar o problema. Primeiro, vamos converter todos os números para o IEEE 754:

  11474.97 ≙ 01000000 11000110 01101001 01111100 00101000 11110101 11000010 10001111

... onde 0 é o sinal (positivo), 10000001100 é o expoente e o resto é a mantissa.

 -10781.34 ≙ 11000000 11000101 00001110 10101011 10000101 00011110 10111000 01010010
    693.63 ≙ 01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010111

Como você pode ver, os grandes números têm o mesmo expoente. Quanto maior o expoente, menos preciso é o número armazenado:

  11474.97 →  11474.9699999999993451638147235
 -10781.34 → -10781.3400000000001455191522837
    693.63 →    693.629999999999995452526491135

Como você já pode ver a partir dos números alinhados, o modo como o 693.63 é armazenado é mais preciso.

Então, o resultado da adição dos números é:

01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010000

Vamos comparar novamente:

01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010000 – Result
01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010111 – Constant

Então, não é exatamente o mesmo. Você deve sempre comparar números de ponto flutuante com uma tolerância. Assim:

abs(a - b) < 0.000000001
    
por 15.03.2017 / 10:42
1

Não sei por que está fazendo isso, mas estou usando o Office 2010 e tendo o mesmo problema.

Para contornar isso, eu mudei A5 para read = ROUND (A3, 2) = ROUND (A4, 2), que resolveu o problema, então eu só posso supor que há algum tipo de problema menor com frações de mini quantidades em algum lugar causando a erro.

E, como disse @yass nos comentários, usar uma instrução IF funcionaria melhor e manteria as coisas um pouco mais organizadas para você, embora, neste caso, não seja 100% essencial.

    
por 15.03.2017 / 09:54