sábado, 18 de setembro de 2010

Casas decimais, arredondamentos e totais

Problemas com casas decimais, arredondamentos e totais existe em muitos aplicativos, no .NET, no Excel, no Access e em muitos outros, creio até que muitos dos leitores já tiveram este tipo de problema, principalmente os que trabalham programando sistemas que envolvem algum módulo financeiro.
Imagine que você esteje programando uma rotina que é responsável por listar uma composição de preço de um determinado produto que é composto por outros produtos, ou seja,possui alguns itens com preços, conforme exemplo abaixo:

Produto: Coleção Engrenagens XPTO
Composição
Item Descrição Qtd. Valor
1 Engrenagem XPTO 1 1,2327
2 Engrenagem XPTO 1 1,2327

Valor Total do Produto: 2,4654

O total seria 2,4654 e arredondando seria 2,47 (Pode usar qualquer função "Round()" que você vai verificar isso).
Não, não é tão fácil assim como parece, imagine que o seu cliente trabalho com composição de preços com quatro casas decimais, mas ele quer que o usuário visualize somente duas casas decimais, eis aí que surge um problema.
Veja como ficaria a listagem:

Produto: Motor XPTO
Composição
Item Descrição Qtd. Valor Valor "Round()"
1 Engrenagem XPTO 1 1,2327 1,23
2 Engrenagem XPTO 1 1,2327 1,23


Valor Total do Produto: 2,4654
Valor Total do Produto com duas casas: 1,23 + 1,23 = 2,46

Arredondando o Valor do produto com quatro casas: Round(2,4654) = 2,47 !!!
Opa! Alguma coisa deu errado! Mas o que foi? Os resultados não batem, há uma diferença de um centavo. Onde ficou esse um centavo?
Esse centavo ficu no arredondamento, sim, quando arredondamos o 1,2327 , perdemos 0,0027.
Todos já conhecem a regra de arredondamento não? Aqui na wikipedia você encontra o seu funcionamento.
Como todos os aplicativos geralmente seguem essa regra de arredondamento, acabamos perdendo alguns centavos. Isso não é um problema de qualquer aplicativo ou linguagem e sim um problema da regra utilizada.
Mas como não podemos mudar a regra, temos que achar uma forma de trabalhar com os arredondamentos sem mostrar ao usuário o erro que é gerado, ou seja, precisamos "excluir" esses centavos a mais que o arredondamento faz.
Devemos então trabalhar da seguinte forma: Sempre antes de executar um cálculo que será visualizado em menos casas decimais do que os seu operadores, devemos antes, arredondar os operadores para fazer o cálculo, sendo assim, o usuário sempre vai visualizar os dados efetivos que foram calculados e não o seu arredondamento executado depois do cálculo.
Veja o exemplo abaixo em C#:

Quando arredondamos depois de fazer o cálculo para exibir para o usuário, poderá ocorrer esse erro dos centavos no arredondamento, mas se fazemos o arredondamento dos operadores antes de executar o cálculo, os dados sempre vão "bater".
Veja como o Excel também se perde:

Em resumo, sempre cheque bem os seus códigos fontes para que não ocorram problemas com os arredondamentos.

quarta-feira, 15 de setembro de 2010

ASP.NET MVC 3 - Novas funções e característica

Muitas pessoas já estão se utilizando da nova versão do MVC, o MVC 3, que foi lançado recentemente. Mas que funções e características novas ele nos trás?
Bem, vou enumerar algumas e explicar brevemente o que elas fazem.

Razor View Engine

Talvez a mais badalada e que nos provém mais flexibilidade na hora de programar. O Razor Engine View é um novo view engine que nos provém a capacidade de programar as Views do MVC utilizando a sintaxe Razor (juntando-se agora às outras três, Spark, NHaml e o tradicional ASPX.
A engine view ASPX nos leva ao clássico ASP, utilizando a sintaxe <%= %> ou a mais nova <%: %> que predominam nos deus códigos, juntos das Master Pages e os controles ASPC.
A engine view Spark (utilizada também no projeto MonoRail Castle) é um pouco diferente, suporta placeholders e mistura livremente HTML com código de programação, utilizando atributos e tags especiais. A vantagem dela é de ser completamente compatível com o XML.
A engine view NHaml é uma implementação para o .NET da linguagem d emarkup Haml, e não utiliza a síntaxe parecendo um XML. Existe ainda a possibilidade de você implementar uma view engine para o mvc.

Mas voltando ao Razor, sua principal característica é o minimalismo, ou seja, chega daquelas páginas cheias de tags e códigos que ficam entre seu código fonte e você, poluindo toda a sua página. Com ele você consegue escrever em C#, VB.NET e HTML.

Ele é compacto, fácil de aprender, não é uma linguagem nova, trabalha com qualquer editor de texto e suporta Unit Tests para suas views. O MVC3 suporta somente Views em Razor que possuem a extensão cshtml e o suporte à VB virá nas próximas versões do MVC 3.
Nesse site você poderá encotnrar mais conteúdo sobre o Razor.

Propriedades Dynamic View e ViewModel

É uma nova propriedade dinâmica que está disponível nas Views, e nos provém acesso ao objeto ViewData utilizando uma sixtaxe simples. Por exemplo, se dois itens são adicionados ao ViewData na Action Index do Controller da View, como no código abaixo:

Essas propriedades podem ser acessadas utilizando-se a seguinte sintaxe:
Esta sintaxe pode ser utilizada no Controller também:

ItálicoSuporte à Multiplos View Engines na Janela "Add View"

A Janela de adição de Views ao projeto do Visual Studio agora dá suporte a seleção de qual Engine View você quer utilizar:
Nova Classe JsonValueProviderFactory

Essa classe permite que os Actions de um Controller recebam os dados (parâmetros) em formato JSON. Aqui você encontra mais sobre esta novidade.

Suporte aos atributos de validação e IValidatableObject do .NET Framework 4

A classe ValidationAttribute foi melhorada no. NET Framework 4 para permitir um suporte melhor à validação. Quando você utiliza um atributo de validação personalizado, você pode usar uma nova sobrecarga, o IsValid que fornece uma instânciado objeto ValidationContext. Essa instância fornece informações sobre o contecto da validação atual, como qual objeto está sendo validado.
Isso permite que você valide um valor de atributo corrente baseado em uma propriedade do Model. Veja o exemplo abaixo que valida se a PropriedadeUM é maior que a PropriedadeDois.

A Validação do novo MVC também suporte a interface IValidatableObject do .NET Framework 4. Essa interface permite que o seu Model implemente uma validação interna, em nível de Model, como este exemplo:

Suporte aos Atributos de Metadata do .NET Framework 4

O ASP.NET MVC 3 agora suporta Atributos de Metadados do .Net Framework 4, como o DisplayAttribute

Novos Action Result Types
No ASP.NET MVC 3, a classe Controller inclui agora dois novos Action Result Types.

HttpNotFoundResult Action
Esse novo tipo de retorno de action é utilizado para indicar quando um recurso procurado pela URL corrente não foi encontrado:
HttpStatusCodeResult Action
Esse novo tipo de retorno de action é usado para definir o código de status de resposta e descrição.


Essas são algumas características novas presentes no MVC 3. Caso queira ver todas na íntegra, você pode verificar o site do MVC http://www.asp.net/mvc.

Você pode fazer o download do MVC 3 Preview 1 aqui.