Resolvendo problemas com arredondamento

April 28th, 2010 | Tags: , , , , , ,

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


No comments yet.