DUVIDA ENTRE CDBL E CSNG

 Tópico anterior Próximo tópico Novo tópico

DUVIDA ENTRE CDBL E CSNG

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#476628 - 17/09/2017 22:26:20

JCM0867
BALNEARIO CAMBORIU
Cadast. em:Março/2012


Última edição em 17/09/2017 22:49:00 por JCM0867

Ol pessoal

Fao a soma de um valores de um grid
Resultado 135.852,79

Se fao:
Resultado = CDbl(Resultado).ToString([]#,##0.00[]) = 135.852,79 -Valor  Correto
Resultado = CSng(Resultado).ToString([]#,##0.00[]) = 135.852,80
pq diferena de 1 centavo? Em outras situaes d at 3 centavos de diferena

Pode ser lixo na primeira soma? como retiro?





Resposta escolhida #476630 - 18/09/2017 00:35:19

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 18/09/2017 00:43:28 por JABA

O csng arredonda conforme o valor do ltimo nmero. Por exemplo, se o nmero for 135.852,74, vai arredondar para 135.852,7. Agora, se for 135.852,75, ele vai arredondar para 135.852,8. Ou seja, se o ltimo nmero for maior ou igual a 5, ele arredonda o penltimo nmero para cima, seno, o penltimo nmero continua com o mesmo valor, e elimina o ultimo nmero em ambos os casos. J o Cdbl no faz o arredondamento, deixando o nmero da mesma maneira que est.



_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#476632 - 18/09/2017 09:04:38

FFCOUTO
COM LEVY GASPARIAN
Cadast. em:Março/2005


JCM0867,

Tanto o CSng quanto o CDbl tem problemas na questo de arredondamento pois so nmeros de pontos flutuantes, veja aqui.

Para valores monetrios eu recomendo o uso de Decimal (.NET) e Currency (VB6) pois ele trabalha de forma precisa nesta questo.

Bem, j tive uma experincia desagradvel com essa questo em relatrios financeiros onde a diferena total podia chegar a R$ 100,00 devido ao volume de transaes. Fica a dica.

Cursos de Excel e VB6:
cursoexcelvba.com.br


#476635 - 18/09/2017 11:57:08

JCM0867
BALNEARIO CAMBORIU
Cadast. em:Março/2012


Última edição em 18/09/2017 11:59:42 por JCM0867

para valores monetrios uso numeric(10,2) no banco e Single na declarao de variveis numricas quando monetrio e alguns percentuais
Passei em alguns lugares onde tem valores no parece ter dado problema com single. em que casos pode dar problemas? fiquei preocupado agora
No VB6 usava Double e tinha problemas com lixo nas casas decimais




#476637 - 18/09/2017 14:18:14

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


JCM0867,

Sempre usei Double nas declaraes, mas sempre tomei cuidado com o arredondamento das casa.
Para o arredondamento, normalmente utilizo assim:
  
        Double valor1 = Math.Round(135852.79, 2, MidpointRounding.AwayFromZero);
        Double valor2 = Math.Round(135852.79, 2, MidpointRounding.ToEven);




#476638 - 18/09/2017 14:23:19

JABA
CABO FRIO
Cadast. em:Agosto/2005


Citação:
Tanto o CSng quanto o CDbl tem problemas na questo de arredondamento pois so nmeros de pontos flutuantes


Vou ter que discordar do colega FFCOUTO. Fiz os testes aqui e no houve o arredondamento. O que quero dizer por arredondamento no pegar somente uma parte do nmero,  e sim fazer com que o nmero anterior ao corte seja acrescido de uma unidade.



_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#476646 - 18/09/2017 22:52:57

JCM0867
BALNEARIO CAMBORIU
Cadast. em:Março/2012


Última edição em 18/09/2017 22:56:37 por JCM0867

Vou dar uma ateno quando ver que a segunda casa decimal com zero. foi o que vi em dois casos de arrendondamento
Deu a impresso que isso aconteceu quando executei um clculo de soma em loop
do tipo ValorTotal = ValorTotal + Mensalidade diversas vezes, ou foi s coincidncia?




#476648 - 19/09/2017 10:05:29

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Citação:
:
Vou dar uma ateno quando ver que a segunda casa decimal com zero. foi o que vi em dois casos de arrendondamento
Deu a impresso que isso aconteceu quando executei um clculo de soma em loop
do tipo ValorTotal = ValorTotal + Mensalidade diversas vezes, ou foi s coincidncia?


No existe coincidncia na matemtica, provvel que esteja acontecendo o arrendondamento e voc no est percebendo.
Normalmente percebemos isto em valores mais altos, onde a diferena aparente.

Formate seu cdigo como mostrei abaixo, e verifique se o resultado diferente
  
Double valor1 = Math.Round(135852.79, 2, MidpointRounding.AwayFromZero);




#476652 - 19/09/2017 13:00:40

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 19/09/2017 13:13:27 por JABA

como eu tentei mostrar a ele, no tem mistrio algum. Digamos que o nmero todo seja 135.852,795. Se ele arredondar com o csng, o resultado ser  135.852,80. Por que? Porque ele sempre arredonda a ltima casa pra cima, independentemente do valor que esteja. Com o Cdbl,  se o valor da ltima casa for maior ou igual a 5, ele retirado e o nmero antes dele acrescido de uma unidade. Se fosse 135.852,795, arredondaria para 135.852,80. Se fosse 135.852,794, arredondaria para 135.852,790.

_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#476653 - 19/09/2017 14:35:23

FFCOUTO
COM LEVY GASPARIAN
Cadast. em:Março/2005


Amigos, percebo que no clicaram no link que disponibilizei para um melhor entendimento da questo do arredondamento e da forma como os pontos flutuantes trabalham na forma binria (que o que o computador entende). Vejam aqui uma outra boa discusso do assunto (em ingls) http://www.xtremevbtalk.com/archive/index.php/t-219163.html.

Para valores pequenos, quase certo no haver diferena. Mas quando os valores comeam a subir, como relatado pelo colega JCM0867, a diferena pode ser tornar muito grande. Ainda mais quando lidamos com a rea financeira, onde necessrio uma preciso de 100%.

Como falei, j passei por uma experincia ruim.

Ao colega JABA, fique vontade para discordar. Estamos aqui para trocar experincias e ajudar uns aos outros. Desde que mantenhamos o bom nvel da conversa acho extremamente vlido a opinio de todos.

Ao JCM0867, minha sugesto para voc que no banco os campos monetrios tenha uma preciso de 4 casas decimais. O tipo ideal seria o []money[] (SQL Server), no caso de no possui-lo, use o numeric(18,4) e nas variveis no software use o tipo decimal.



Cursos de Excel e VB6:
cursoexcelvba.com.br


#476655 - 19/09/2017 16:47:58

JABA
CABO FRIO
Cadast. em:Agosto/2005


Citação:
Amigos, percebo que no clicaram no link que disponibilizei para um melhor entendimento da questo do arredondamento e da forma como os pontos flutuantes trabalham na forma binria (que o que o computador entende).


Eu cheguei dar uma lida, inclusive, j estudei isso na faculdade. Nmeros irracionais so infinitos, e como a memria do PC algo finito, o valor ser quebrado em alguma parte. S que o problema aqui no a origem do nmero, e sim arredondar sobre um nmero j existente. Ou seja, a mquina gera um nmero quebrado por falta de recursos, e queremos arredonda-lo manualmente para um outro formato.

Citação:
Ao colega JABA, fique vontade para discordar. Estamos aqui para trocar experincias e ajudar uns aos outros. Desde que mantenhamos o bom nvel da conversa acho extremamente vlido a opinio de todos.


Ns estamos respondendo questo dele sobre pticas diferentes . Voc est respondendo com base nas consequncias, e eu sobre o porqu de faltar o 1 centavo, pois esse foi o motivo da criao do tpico. Olha o que ele disse: []pq diferena de 1 centavo? Em outras situaes d at 3 centavos de diferena[].

_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por JCM0867 em 20/09/2017 18:48:18