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.