Resolvendo problemas com arredondamento
Um dos maiores problemas que ja passei trabalhando com duas linguagens em conjunto, foi a diferente forma em que elas trabalham com arredondamentos.
Todas as linguagens tem suas funções nativas de arredondamento de valores, porém, algumas vezes, o resultado final não bate, dando uma diferença de centavos, que se somado podem virar milhões…
Para resolver este problema desenvolvi uma função de arredondamento que segue a lógica de “Arredondamento por Módulos“, que foi gentilmente explicada a mim por André Ctenas ( Engenheiro, Fotógrafo e Nutricionista ), cliente da RIA Labs.
Abaixo segue a função em PHP e AS3, muito simples, com 2 parâmetros necessários:
Valor a ser arredondado
Quantidade de casas decimais
PHP:
1 2 3 4 5 6 | public function round_number( $valor, $decimais = 2 ) { $fator = pow(10, $decimais); $valorArredondado = intval(($valor * $fator) + 0.5) / $fator; return $valorArredondado; } |
AS3:
1 2 3 4 5 6 | public function round_number( valor:Number, decimais:int ):Number { var fator:Number = Math.pow(10, decimais); var result:Number = Number( int((valor * fator) + 0.5) / fator ); return result; } |
Java ( enviado por @javacia_caio ):
1 2 3 4 5 6 7 8 9 | public static double round_number(double valor, int decimais) { double fator = Math.pow(10, decimais); if (valor >= 0) { return ((long) (valor * fator + 0.5)) / fator; } else { return ((long) (valor * fator - 0.5)) / fator; } } |
Você pode pegar estas funções e adicionar a sua classe de utilidades, e você não terá mais problemas com arredondamento.
Você tbm pode usar a mesma lógica e criar esta função em outras linguagens.
[]‘s
