JavaFree.org | RubyOnBr.org

calculo float

Acompanhar calculo float 2 posts, 2 participantes

Avatar Neves 162 posts

Opa, sei que nao eh culpa do Ruby, pois toda linguagem tem este problema devido ao modo como o float funciona. Mas gostaria de saber qual a maneira correta.

Estou fazendo um sistema financeiro e preciso saber como comparar valores com arredondamento de casas decimais, exemplo:
parcela = 1.8 / 3
total = parcela * 3
total == 1.8 # aqui vem a surpresa, o resultado é false.

Como faço para comparar os valores e indicar qual a tolerância que preciso, no caso de duas casas decimais por se tratar de moeda.

Pensando em modo Ruby, poderia ter algo assim:
Float.tolerance = 2 #modifica internamente o operador == para comparar float utilizando uma tolerancia de 2 casas decimais. Hoje estou fazendo assim:

total = (total * 100).round
total = total / 100.0
total == 1.8 # agora é true será que sempre?

Alguma sugestão?

 
Avatar Akita On Rails 298 posts

Comparação de Floating Point é historicamente problemático, como você disse, por toda a área de computação.

Portanto não se faz comparação de equivalência (==) entre floats. O que se faz é a diferença entre floats e daí você garante que ele está abaixo do nível de precisão que você precisa.

Veja o assert_in_delta