Comportamento de soma com pontos flutuantes

4 respostas
bruno_rg

Olá pessoal,

Eu estava olhando alguns exemplos antigos do meu workspace e encontrei um bem interessante.

A classe realiza somas com números de pontos flutuantes gerando resultados diferentes para a "mesma soma" (0.3+0.3+0.3).

Saída:

Valor1: 0.9
Valor2: 0.90000004
Valor3: 0.8999999761581421
Valor4: 0.8999999999999999
Valor5: 0.900000035762786865234375
Valor6: 0.899999999999999966693309261245303787291049957275390625
Valor7: 0.9

import java.math.BigDecimal;

public class ProblemaSomas {
		
	public static void main(String[] args) {

		// Soma de literais float com cast do resultado 
		float x;
		x = (float) (0.3 + 0.3 + 0.3);
		System.out.println("Valor1: " + x);

		// Soma de variaveis float
		float y, a = (float) 0.3, b = (float) 0.3, c = (float) 0.3;
		y = a + b + c;
		System.out.println("Valor2: " + y);

		
		// Soma de variáveis double com cast do resultado para float 
		double z, aa = 0.3, bb =  0.3, cc = 0.3;
		z = (float) (aa + bb + cc);
		System.out.println("Valor3: " + z);

		// Soma direta de literais no println 
		System.out.println("Valor4: " + (0.3 + 0.3 + 0.3) );
		
		// Soma usando BigDecimal(float num)
		BigDecimal b1 = new BigDecimal(0.3f);
		BigDecimal b2 = BigDecimal.ZERO;
		b2 = b2.add(b1).add(b1).add(b1);
		System.out.println("Valor5: " + b2);
		
		// Soma usando BigDecimal(double num)
		BigDecimal b3 = new BigDecimal(0.3d);
		BigDecimal b4 = BigDecimal.ZERO;
		b4 = b4.add(b3).add(b3).add(b3);
		System.out.println("Valor6: " + b4);
		
		// Soma usando BigDecimal(String num)
		BigDecimal b5 = new BigDecimal(""+0.3);
		BigDecimal b6 = BigDecimal.ZERO;
		b6 = b6.add(b5).add(b5).add(b5);
		System.out.println("Valor7: " + b6);

	}
}

:twisted: Muito cuidado ao escrever programas financeiros.

4 Respostas

rogelgarcia

Para calculos financeiros deve-se utilizar tipos de dados inteiros…

Luca

Olá

  1. Uma pergunta, quem souber responda:
    Nos cursos de informática não se aprende mais cálculo numérico?
    Para mim, que aprendi cálculo numérico em 1966, acho muito esranho quando alguém imagina que 0.3 + 0.3 seja exatamente igual a 0.6. Será que não é óbvio o que acontece com a representação interna dos números nos computadores digitais?

  2. Quem não acredita que 0.3 + 0.3 = 0.6 ± epsilon —> onde epsilon = número muito pequeno, veja o texto do Paulo Silveira em http://blog.caelum.com.br/2010/07/15/arredondamento-no-java-do-double-ao-bigdecimal/

[]s
Luca

rogelgarcia

Eu tive calculo numérico…

Mas talvez meu curso nao foi tão profundo igual ao seu :D… ou pelo menos nao foi tao bem associado a computacao

Na verdade aprendi isso em matérias de programacao

bruno_rg

Boa Luca,

Você entrou em um ponto que eu acredito ser de extrema importância.

Já presenciei diversas vezes pessoas afirmando que universidade não serve pra nada ou que estudos para certificações são perda de tempo.

Em ambos os casos que você citou eu pude aprender o por quê do comportamento do exemplo. Cálculo Numérico (na universidade) e representação interna dos números nos computadores (universidade e certificação programmer).

Será que o que aprendemos na universidade realmente não é importante?

Criado 16 de julho de 2010
Ultima resposta 16 de jul. de 2010
Respostas 4
Participantes 3