CALCULO ERRADO ?

ICHIHARA 20/11/2013 17:44:16
#431311
Boa Tarde pessoal...

Em teste o calculo abaixo deveria dar 0

Text4.Text = 60000.01 - 30000 - 30000 [ô]textbox
x = 60000.01 - 30000 - 30000 [ô] variavel double

Mas isto não esta acontecendo... alguem ja viu isso?

Obrigado!
KWIIBY 20/11/2013 20:52:52
#431317
Amigo, use uma variável Currency, single ou double para trabalhar com números com vírgula! abraços
ICHIHARA 21/11/2013 08:32:29
#431319
Um detalhe, descobri que com o tipo currency funciona, mas quando uso double o resultado da errado.
Porque acontece isso?
OCELOT 21/11/2013 09:59:36
#431326
Resposta escolhida
O cálculo deveria dar 0,01 e não 0, e o resultado é menor que 1, só que double e single são variáveis que a precisão não é garantida, podendo ter uma diferença minúscula no resultado

No caso dessa conta o resultado é

1,00000000020373E-02

Veja aquele E-02 no final, isso significa que a casa decimal deve ser movida duas casas para a esquerda, então isso é o mesmo que

0,0100000000020373

O resultado que você esperava era o de 0,01, só que como double ou single não garantem a precisão acontece de sair um valor bem próximo do esperado.

Isso acontece porque o formato da variável na memória não consegue realmente representar todos os números existentes, então ele aproxima o número, por isso que quando se precisa garantir precisão, como por exemplo quando se trata de dinheiro, deve-se usar o currency, pois o currency em memória usa um valor inteiro, onde os últimos 4 dígitos vão ser usados para representar as casas decimais, assim ele garante a precisão dos valores.
ICHIHARA 21/11/2013 10:31:04
#431330
Ola Ocelot!

desculpe, fiquei tao abalado que na verdade a conta correta seria:
dim x as double

x = 60000.01 - 30000.01 - 30000

E o resultado não da 0.

Não sabia disto, entrei no MSDN e existe a seguite descrição:

Double (double-precision floating-point)

Currency(scaled integer)


Isto tem haver com a sua explicação?

Engraçado que não são todas as contas que dão erro.
ICHIHARA 21/11/2013 11:16:44
#431333
Artigo interessante

http://support.microsoft.com/kb/42980/pt-br
OCELOT 21/11/2013 11:38:43
#431337
Certo, faltou um 0.01 ali, mas ainda é a mesma coisa, o problema é o de tipos double e single não garantem a precisão.

No VB6 tive o seguinte resultado

60000.01 - 30000.01 - 30000 = 3,63797880709171E-12

Como no final o E-12 indica uma notação diferente, onde a casa decimal está na verdade 12 casas para a direita o resultado é o mesmo que

0,00000000000363797880709171

é bem próximo do esperado e dentro da faixa de erro do double, veja que double garante cerca de 10 ou 11 casas decimais (não sei ao certo), isso significa que os valores que estão nestas casas decimais estão corretos, mas não que não vá ter outras casas decimais depois delas com números incorretos, que é o que acontece nesse caso. No caso o resultado esperado era 0 e veio zero com 11 casas decimais corretas, todas zero, porém com erro nas próximas casas decimais, o que deve ser esperado que aconteça com o tipo double.
ICHIHARA 21/11/2013 13:12:11
#431339
Nossa... Muito obrigado Ocelot, parabéns
Tópico encerrado , respostas não são mais permitidas