No Excel, quando digito 22222.09482, vejo o número 22222.0948199999 na barra de fórmulas

28

Você poderia ajudar - como eu tenho uma situação estranha que, quando digito um número 22222.09482 na célula, vejo um número diferente 22222.0948199999 na barra de fórmulas. Abaixo está o instantâneo do problema.

Erro de amostra

Vejo o mesmo comportamento ao inserir os seguintes números:

22222.09482
33333.09482
44444.09482
55555.09482

mas quando insiro 11111.09482 e 66666.09482, 77777.09482 .. até 99999.09482, eles são exibidos corretamente. Não sei se isso está relacionado ao arredondamento? Não configurei nenhum perfil de arredondamento. Você poderia me ajudar a resolver o problema.

user954171
fonte
11
Encontrar bem, faz o mesmo para mim - você pode simplesmente usar ROUND()? =ROUND(A1,5), copie / cole os dados como Valores e remova os números originais?
BruceWayne
11
@BruceWayne, curiosamente, ROUND()mostra os dígitos corretos, mas copiar / colar como valor o leva de volta à edição original!
Rey Juna 15/10
11
@ReyJuna - Em seguida, basta fazer ROUND(A1,5)novamente os valores colados. Em seguida, copie / cole-os como valores e Round(), novamente, copie / cole. ...: P ... isso é interessante, e parece que @EugenRieck tem o raciocínio. Boa pergunta!
BruceWayne
11
Você realmente se importa com a diferença entre 22222.09482 e 22222.0948199999? É uma diferença de 5 partes em 100 trilhões.
Russell Borogove
4
A matemática do ponto flutuante está quebrada? . No entanto isso é provavelmente um erro, uma vez que doubletem precisão suficiente para que, quando mostra arredondados os valores corretos como a maioria das pessoas espera
phuclv

Respostas:

31

Isso é um bug.

O Excel usa a representação de precisão dupla IEEE usual, de acordo com outras respostas. Sua precisão é de 53 dígitos binários significativos, o que corresponde a aproximadamente 16 dígitos decimais.

É sempre "seguro" exibir os 15 primeiros dígitos decimais significativos. No sentido de que qualquer número "apresentado" decimal com 15 dígitos pode ser distinguido com segurança dos números obtidos, alterando a décima quinta figura decimal por um. Por exemplo, os números de 15 dígitos:

22222.09481 99999
22222.09482 00000
22222.09482 00001

mapear para três números distintos de precisão dupla. Nenhum desses três será "vizinhos" na representação de precisão dupla, neste caso em particular.

Portanto, confundir os dois primeiros na exibição do usuário, é um erro do Excel.

De fato, nesse domínio (entre 16384 e 32768), a precisão absoluta é de 2 a 38 e os seguintes números são representáveis:

...
22222.09481 99998 96571 9714760780334472656250000
22222.09481 99999 00209 9502831697463989257812500 <-- the one closest to what Excel showed to the user
22222.09481 99999 03847 9290902614593505859375000
22222.09481 99999 07485 9078973531723022460937500
22222.09481 99999 11123 8867044448852539062500000
22222.09481 99999 14761 8655115365982055664062500
22222.09481 99999 18399 8443186283111572265625000
22222.09481 99999 22037 8231257200241088867187500
22222.09481 99999 25675 8019328117370605468750000
22222.09481 99999 29313 7807399034500122070312500
22222.09481 99999 32951 7595469951629638671875000
22222.09481 99999 36589 7383540868759155273437500
22222.09481 99999 40227 7171611785888671875000000
22222.09481 99999 43865 6959682703018188476562500
22222.09481 99999 47503 6747753620147705078125000
22222.09481 99999 51141 6535824537277221679687500
22222.09481 99999 54779 6323895454406738281250000
22222.09481 99999 58417 6111966371536254882812500
22222.09481 99999 62055 5900037288665771484375000
22222.09481 99999 65693 5688108205795288085937500
22222.09481 99999 69331 5476179122924804687500000
22222.09481 99999 72969 5264250040054321289062500
22222.09481 99999 76607 5052320957183837890625000
22222.09481 99999 80245 4840391874313354492187500
22222.09481 99999 83883 4628462791442871093750000
22222.09481 99999 87521 4416533708572387695312500
22222.09481 99999 91159 4204604625701904296875000
22222.09481 99999 94797 3992675542831420898437500
22222.09481 99999 98435 3780746459960937500000000 <-- the one closest to what the user types
22222.09482 00000 02073 3568817377090454101562500
22222.09482 00000 05711 3356888294219970703125000
22222.09482 00000 09349 3144959211349487304687500
22222.09482 00000 12987 2933030128479003906250000
22222.09482 00000 16625 2721101045608520507812500
22222.09482 00000 20263 2509171962738037109375000
22222.09482 00000 23901 2297242879867553710937500
22222.09482 00000 27539 2085313796997070312500000
22222.09482 00000 31177 1873384714126586914062500
22222.09482 00000 34815 1661455631256103515625000
22222.09482 00000 38453 1449526548385620117187500
22222.09482 00000 42091 1237597465515136718750000
22222.09482 00000 45729 1025668382644653320312500
22222.09482 00000 49367 0813739299774169921875000
22222.09482 00000 53005 0601810216903686523437500
22222.09482 00000 56643 0389881134033203125000000
22222.09482 00000 60281 0177952051162719726562500
22222.09482 00000 63918 9966022968292236328125000
22222.09482 00000 67556 9754093885421752929687500
22222.09482 00000 71194 9542164802551269531250000
22222.09482 00000 74832 9330235719680786132812500
22222.09482 00000 78470 9118306636810302734375000
22222.09482 00000 82108 8906377553939819335937500
22222.09482 00000 85746 8694448471069335937500000
22222.09482 00000 89384 8482519388198852539062500
22222.09482 00000 93022 8270590305328369140625000
22222.09482 00000 96660 8058661222457885742187500
22222.09482 00001 00298 7846732139587402343750000
...

Para aprofundar, tente digitar 22222.09482em uma célula e digitar 22222.0948199999(cinco noves) em outra célula. O Excel deve escolher os dois representantes do IEEE indicados pela seta acima. E acho que sim, porque você pode calcular a diferença dessas duas células para obter 9.82254E-11. Mas ambos são mostrados da mesma maneira.

Se o Excel tivesse mostrado os 17 primeirosdígitos, seria útil escolher exatamente qual é o número IEEE "abaixo" do número decimal. Nesse caso:

22222.0948199999 --> 22222.09481 99999 00
22222.09482      --> 22222.09481 99999 98

Mas mostrar 15 dígitos arredondados de maneira incorreta é enganoso e inútil.


Antes que alguém afirme que é intencional, por que 8.7não mostra o mesmo comportamento? O número de precisão dupla mais próximo de 8.7é:

8.69999999999999 93

portanto, deve mostrar como 8.69999999999999se isso fosse intencional. Mas isso não acontece.

Jeppe Stig Nielsen
fonte
9
Você está certo, é um bug. Os algoritmos para converter um número de ponto flutuante binário que exibe o menor número de dígitos significativos são difíceis, mas conhecidos. Parece que alguém perdeu alguns detalhes importantes.
Mark Ransom
2
@Ruslan Tenho visto muitos threads na aritmética de ponto flutuante, no Stack Overflow e em outros sites SE, e muitas vezes as pessoas dão uma resposta com todos os tipos de verdades e noções gerais sobre o ponto flutuante (binário), sem se relacionar com os números reais e verificar se o comportamento é compatível com IEEE. Eu acho que poderia postar a pergunta "Por que 2.1 + 2.2retorna 4.80000001?" e recebo muitas respostas dizendo que é isso que devo esperar quando uso o ponto flutuante.
Jeppe Stig Nielsen
11
@benshepherd: a captura de tela do LibreOffice não mostra o que mostra a captura de tela do Excel #
Thomas Weller
11
@JeppeStigNielsen: 2.1 + 2.2 = 4.8? Isso é apenas 0,5 de desconto. É normal.
Thomas Weller
@ MarkRansom: então, o Excel realmente implementa isso? O Excel não é implementado em C ++ ou algo que faz esse cálculo de ponto flutuante? É isso que você está dizendo? Ou o bug já está em C ++ e, portanto, afeta milhões de aplicativos?
Thomas Weller
22

O Excel armazena números no formato de ponto flutuante binário IEEE 754 de 64 bits. A chave é "lojas" - a mudança de decimal para binário ocorre sempre que um número é armazenado, não apenas quando é usado em um cálculo real.

Um bom artigo sobre isso está em Noções básicas sobre precisão de ponto flutuante, também conhecido como "Por que o Excel me dá respostas aparentemente erradas?"

É possível criar um programa de planilha que lide com números realmente grandes com muitos dígitos significativos. Mas não é terrivelmente prático. O Excel poderia ter sido projetado para usar o formato decimal128 IEEE 754 , que permite 34 dígitos decimais - mais que o suficiente para armazenar 22222.09482. Mas, em vez disso, usa o formato binário64 Double Precision , muito mais comum , com 53 bits de precisão, com pouco menos de 16 dígitos. Embora você possa pensar que isso seria suficiente para um número com apenas 10 dígitos, a conversão de decimal em binário complica um pouco as coisas - ou seja, 2222209482 pode ser armazenado 100% corretamente como um número binário64, mas 22222.09482 não pode.

Lembre-se de que normalmente as planilhas são usadas para dados financeiros, que normalmente não exigem tantos dígitos de precisão, ou para modelagem "what if" em uma variedade de cenários, nos quais não é necessário um nível muito alto de precisão. Certamente existem outras ferramentas (e provavelmente outros programas de planilhas, mas não pesquisei recentemente) que, por padrão ou por definições de configuração especiais, podem usar um formato numérico maior, mas o Excel não é um deles.

Para aqueles que apontam que o LibreOffice lida melhor com isso, a aparência pode enganar. Veja este post para mais detalhes. Parece que o LibreOffice lida com grandes números de maneira um pouco diferente, mas tem a mesma representação básica de ponto flutuante de 64 bits com problemas semelhantes.

manassehkatz-Reinstate Monica
fonte
3
Essa resposta seria melhor se também explicasse a observação de que alguns números com decimais são mostrados exatamente como inseridos - como 11111.09482 no exemplo do OP.
andrew
11
Apenas por diversão: 22222.09482é armazenado como 1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)no IEEE 754, ou em outras palavras, exatamente como 1.35632902954101553 * 2^14é 22222.0948199999984353787904.
YoYoYonnY
11
Binary64 (também conhecido como precisão dupla) é mais que suficiente para um número com dez dígitos decimais. É claro que não pode ser representado exatamente, mas a maioria dos números, incluindo 0.2e 0.1não pode ser representada exatamente (a fração 1/5 (um quinto) tem uma expansão binária recorrente infinita). No entanto, o Excel mostra as coisas de uma maneira confusa.
Jeppe Stig Nielsen
2
"Lembre-se de que normalmente as planilhas são usadas para dados financeiros, o que normalmente não exige tantos dígitos de precisão" - isso geralmente é muito errado - os dados financeiros exigem um comportamento preciso no sentido "o que você digita é o que espera que permaneça lá. ", Você está certo com a conversão decimal / binária etc, mas esse argumento em particular é inválido! Para dados financeiros, geralmente usamos algum tipo Moneyou BigIntegerformato, que geralmente usa o formato de armazenamento decimal .
Honza Zidek
4
Esta resposta não é suficiente para explicar o que acontece. Estamos observando um erro no Excel, onde o número está formatado incorretamente . 22222.09482 e 22222.0948199999 são números binários64 distintos.
Ruslan #
11

Ao fazer seus cálculos, o Excel precisa encontrar uma boa representação binária interna para os números que usa. No seu caso, ele usa um número de ponto flutuante e, de fato, esse formato de dados tem uma aproximação (muito boa) para o seu número, mas não corresponde exatamente. Portanto, se você não informar explicitamente ao Excel qual formato de saída usar, ele fará um "melhor esforço", resultando em uma saída mais próxima do valor calculado internamente, mas não é exatamente o texto digitado.

Só para deixar isso claro: Entendendo que o texto digitado representa um número e a conversão da sequência de dígitos em um número já atende à definição de "cálculo" de cima.

EDITAR

Eu não deixei claro o suficiente, que considero a escolha de usar uma representação de ponto flutuante de 64 bits realmente boa: o Excel não é uma ferramenta para cientistas, onde um erro de arredondamento no décimo primeiro dígito após o ponto decimal gera um grande impacto, mas os contadores não querem que sua velocidade de processamento seja reduzida em um fator de milhões para acomodar uma fonte de cálculo inexato que pode se manifestar em números que eles nunca usam.

Se você usar um programa de planilha para o que foi projetado e usar formatação explícita de saída para garantir que esses efeitos nunca cheguem ao domínio visível, você estará bem.

Eugen Rieck
fonte
11
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
DavidPostill
11
Esta resposta não é suficiente para explicar o que acontece. Estamos observando um erro no Excel, onde o número está formatado incorretamente. 22222.09482 e 22222.0948199999 são números binários64 distintos.
Ruslan #
2

Quando insiro 11111.09482 e 66666.09482, 77777.09482 .. até 99999.09482, eles são exibidos corretamente. Não sei se isso está relacionado ao arredondamento? Não configurei nenhum perfil de arredondamento. Você poderia me ajudar a resolver o problema.

Alguns números podem ser representados corretamente e outros não.

Defina a precisão exibida adequadamente para seus cálculos e use a função round () .

  • Explicação:

  • Solução:

    É possível evitar com freqüência que os erros de arredondamento de ponto flutuante afetem seu trabalho, definindo a opção Precisão como exibida antes de aplicar um formato numérico aos seus dados. Esta opção força o valor de cada número na planilha a ter a precisão exibida na planilha.

    1. Clique em Arquivo> Opções.
      No Excel 2007: Clique na imagem do botão Microsoft Office Button Office e clique em Opções do Excel.
      Imagem do botão

    2. Clique em Avançado e, em Ao calcular esta pasta de trabalho, marque a caixa de seleção Definir precisão como exibida e clique em OK.

    3. Clique OK.

    4. Na planilha, selecione as células que você deseja formatar.

    5. Na guia Página inicial, clique na imagem do botão Iniciador da caixa de diálogo ao lado de Número.
      Imagem do botão do iniciador
      Imagem da faixa de opções do Excel

    6. Na caixa categoria, clique em número.

    7. Na caixa Casas decimais, digite o número de casas decimais que você deseja exibir.

    Dica: Para minimizar os efeitos da imprecisão do armazenamento aritmético de ponto flutuante, você também pode usar a função ROUND para arredondar números para o número de casas decimais exigidas pelo seu cálculo.

  • Journal of Accountancy - " Corrigido pelos erros de cálculo do Excel ":

    Certos números ímpares criam decimais binários repetidos e, quando esses dígitos repetidos são cortados após 15 casas, o número binário não é convertido com precisão novamente para o valor numérico pretendido. Como exemplo, em todas as edições do Excel, a fórmula 22.26 - 21.29 deve gerar 0,97, mas, em vez disso, produz 0,9700000000000000002. Experimente e lembre-se de aumentar a largura da coluna e as casas decimais para que você possa ver o problema de cálculo.

    Tais erros são geralmente considerados insignificantes ou imateriais porque raramente se manifestam em erros significativos de cálculo; no entanto, eis duas medidas que você pode tomar para eliminar possíveis erros de ponto decimal flutuante:

    1. A função ROUND. Use a função ROUND do Excel para arredondar seus valores calculados para a casa decimal desejada, eliminando assim qualquer possibilidade de anomalias do 15º dígito. Por exemplo, a fórmula = ROUND (-21,29 + 22,26,2) produz com precisão 0,97.

    2. Precisão. Você pode ativar a opção Precisão como exibida do Excel para forçar todas as fórmulas a truncar e arredondar valores calculados com base nos dígitos visíveis.

    Para ativar esta opção no Excel 2013, 2010 e 2007, selecione Arquivo (ou o Office Orb), Opções (ou Opções do Excel), Avançado e, na seção Ao calcular esta pasta de trabalho, marque a caixa Definir precisão como exibida e depois clique em OK.

    No Excel 2003, 2002 e 2000, no menu Ferramentas, selecione Opções e, na guia Cálculo, em Opções da pasta de trabalho, marque a caixa Precisão conforme exibida e clique em OK.

Roubar
fonte
11
A explicação é irrelevante: a diferença entre os números esperados e os obtidos é 28 ULP - demais para erro natural de arredondamento. A "solução" apenas oculta um bug real.
Ruslan #
Seria ótimo se você pudesse postar isso, juntamente com alguns links para sua resposta, como sua própria resposta em vez de um comentário. Dessa forma, chamaria a atenção do usuário954171 e as pessoas poderiam votar nele. Você pode fornecer um link para o Relatório de Erros?
Rob
Já existe uma resposta com todos os detalhes matemáticos relevantes. Não sei de nenhum relatório de bug sobre isso.
Ruslan #
0

Como eu tenho certeza que você sabe, os computadores trabalham internamente apenas usando zeros e uns (também conhecidos como bits) e têm um número fixo de bits para representar um valor (normalmente 64 bits atualmente). Isso significa que o número de valores diferentes que podem ser representados é de 2 à 64ª potência. É um número enorme, com certeza, mas o número de valores possíveis é finito, portanto nem todos os números podem ser representados. Quando encontra um número que não pode representar exatamente, ele é automaticamente substituído pelo mais próximo que pode representar. É isso que você está vendo.

Javier Alvarado
fonte
Você está afirmando que é por causa da conversão de base numérica ou por quantidade limitada de memória por valor? Nos dois casos, seu raciocínio está errado. Tecnicamente, é perfeitamente possível ter números de precisão e comprimento arbitrários - assumindo memória infinita. Para dar um exemplo, existe o GNU bignum. Além disso, não há necessidade inerente de codificar números em um formato com perdas. Portanto, nem a ciência da computação é culpada, nem os números binários. Somente os desenvolvedores do Excel escolheram uma codificação numérica com entrada perdida do usuário.
Phresnel # 16/18
-1

Os computadores fazem suas contas em binário e quase sempre usam ponto flutuante para valores não inteiros. Os únicos valores fracionais que podem ser representados precisamente em ponto flutuante devem ser a soma de alguma combinação de potências fracionárias de 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...) terminando no limite de precisão projetado (geralmente 53 bits). Esses valores nem sempre têm uma representação exata ou exata em decimal e, inversamente, nem todos os valores fracionários que você pode representar exatamente em decimal terão uma representação exata em binário. Por exemplo: 0.1. Não pode ser representado como uma soma de potências fracionárias de 2 que não dura para sempre.

Quando você insere um valor decimal em sua planilha, ele será convertido e armazenado em binário, e casos como você descreveu se tornarão a aproximação mais próxima que pode ser representada em binário. Quando exibido, é convertido novamente em decimal, exigindo novamente uma aproximação, que pode não ser convertida novamente exatamente na mesma representação que você inseriu.

Por que 53 bits (mais ou menos)? Como o padrão típico para armazenar pontos flutuantes de "dupla precisão" usa 64 bits, nos quais há uma mantissa (também chamada de significando), um indicador de sinal e um expoente. O expoente geralmente recebe 10 bits, o sinal leva um, deixando 53 para a mantissa. Isto é para armazenamento. Os cálculos geralmente são feitos usando 80 bits e arredondados para trás.

Há situações em que os computadores funcionarão na base 10, especialmente ao trabalhar com valores monetários nos quais artefatos de arredondamento não são aceitáveis.

Zenilogix
fonte
2
Não concordo com uma declaração geral de todos os computadores . Havia muitos computadores, reconhecidamente a maioria não está mais em uso ativo, exceto como peças de museu, que usavam formatos numéricos decimais para armazenamento e cálculos. Também há o BCD - Decimal Codificado Binário - usado em várias CPUs mais recentes, incluindo uso limitado em CPUs Intel. Nada disso é relevante para a questão em questão - o método usado pelo Microsoft Excel para armazenar números, que é todo binário. Mas "Todos os computadores" não está correto.
manassehkatz-Reintegrar Monica
Eu vejo a mudança de "Todos os computadores" para "Computadores" - eu usaria "Quase todos os computadores" ou "A maioria dos computadores modernos" ou algo assim. Eu sei - sou exigente. Mas o mesmo acontece com os computadores :-)
manassehkatz-Reinstate Monica
@manassehkatz Todos os computadores digitais são fundamentalmente binários. O BCD é apenas uma estrutura de base 10 no topo do binário para facilitar a aritmética decimal.
Zenilogix
Embora todos os computadores digitais sejam fundamentalmente binários, na verdade havia alguns poucos nos primeiros dias com base decimal. Mas eu concordo que o BCD é essencialmente uma estrutura de base 10 em cima do binário para facilitar a aritmética decimal.
manassehkatz-Reintegrar Monica
Essa resposta soa como se fosse culpa do computador. Mas não é. Você pode representar qualquer número com precisão, escrever em papel (representar 1/3 exatamente? Fácil ao armazenar como fração, por exemplo). É realmente sobre qual representação os autores do Excel escolheram para representar números.
Phresnel # 16/18
-1

Como muitos acima disseram, este é um erro de representação interna. O Excel optou pela precisão dupla, números de ponto flutuante de 64 bits. Isso fornece 2 64 valores possíveis. O domínio dos números reais contém uma infinidade de valores; portanto, quando você tenta usar um que não pode ser representado pelo Excel, ele usa o mais próximo que pode ser representado.

Vi comentários dizendo que, dada a memória infinita, qualquer número real pode ser representado. É verdade, mas não existe "memória infinita", então esse é um ponto discutível. Outros afirmaram que o Excel poderia ter usado uma representação interna maior, por exemplo, 128 bits. É verdade que os computadores são melhores em operações matemáticas em números representados com o número de bits que corresponde ao tamanho do barramento do processador. Portanto, um computador de 32 bits será mais rápido em operações matemáticas em números de 32 bits e um computador de 64 bits será mais rápido em operações matemáticas em números de 64 bits. Se e quando houver um computador de 128 bits, podemos esperar que o Excel mude para a representação numérica de 128 bits. Isso ainda fornecerá um conjunto muito grande, mas limitado, de números que podem ser representados.

Se sua preocupação é com a aparência dos números na planilha, o uso de uma precisão definida (número de casas decimais) fornecerá resultados consistentes. Se você se preocupa com a diferença entre o número digitado e o número real armazenado pelo Excel, você está certo. A diferença é real e o erro será realizado nos cálculos que você fizer. Receio que você esteja preso com esse erro. Essa é uma limitação do Excel, não um bug, como alguns declararam. Não é provável que mude tão cedo, por isso, se não for aceitável para você, sugiro que procure outro aplicativo de planilha que possa representar números com maior precisão. Mas lembre-se de que, se você encontrar um aplicativo desse tipo, a limitação ainda estará lá. É apenas o tamanho do erro que é diferente.

Tibi
fonte