CALCULO ERRADO ?
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!
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!
Amigo, use uma variável Currency, single ou double para trabalhar com números com vÃrgula! abraços
Um detalhe, descobri que com o tipo currency funciona, mas quando uso double o resultado da errado.
Porque acontece isso?
Porque acontece isso?
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.
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.
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.
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.
Artigo interessante
http://support.microsoft.com/kb/42980/pt-br
http://support.microsoft.com/kb/42980/pt-br
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.
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.
Nossa... Muito obrigado Ocelot, parabéns
Tópico encerrado , respostas não são mais permitidas