[quote=entanglement]É por isso que o pessoal reclama que Java é complicado.
Logo de cara apresentam o rapaz ao BigDecimal, que só deve ser usado em algumas situações
No caso específico que ele queria, um double é suficiente, sabendo é claro formatar o número adequadamente (normalmente, um System.out.printf ou um String.format é mais que suficiente).
[/quote]
No livro Java Efetivo, de Joshua Bloch, é recomendado evitar float e double onde são requeridas respostas exatas.
É aconselhado também usar BigDecimal, int ou long para cálculos monetários.
Se o Danilo pretende utilizar o programa para obter respostas exatas, em particular se pretende fazer cálculos monetários, acho recomendável que ele utilize BigDecimal (ou int ou long).
Não acho tão complicado assim usar o BigDecimal, e não acho que o pessoal tenha razão de reclamar que Java é complicado por causa disso.
Coloco abaixo um código para mostrar o que pode acontecer ao realizar cálculos monetários com double:
A regra de negócio é a seguinte: uma empresa concede um empréstimo somente aos funcionários cujo salário liquido é menor ou igual a um valor limite. O salario líquido é o salario bruto menos o desconto. O codigo abaixo verifica se o empréstimo é valido usando ponto flutuante e big decimal.
No meu computador, com processador Intel e Windows 7, ao usar ponto flutuante o sistema nega o empréstimo a um funcionário que deveria ter direito.
import java.math.BigDecimal;
public class PontoFlutuante {
public static void main(String[] args) {
System.out.println("Calculo usando ponto flutuante:");
pontoFlutuante();
System.out.println();
System.out.println("Calculo usando big decimal:");
bigDecimal();
}
private static void pontoFlutuante(){
double salario_bruto = 1000.70;
double desconto = 500.30;
double salario_liquido = salario_bruto - desconto;
double limite = 500.40;
System.out.println("Valor do salario liquido: " + salario_liquido);
if(salario_liquido <= limite){
System.out.println("Emprestimo valido");
}else{
System.out.println("Emprestimo invalido");
}
}
private static void bigDecimal(){
BigDecimal salario_bruto = new BigDecimal("1000.70");
BigDecimal desconto = new BigDecimal("500.30");
BigDecimal salario_liquido = salario_bruto.subtract(desconto);
BigDecimal limite = new BigDecimal("500.40");
System.out.println("Valor do salario liquido: " + salario_liquido);
if(salario_liquido.compareTo(limite) <= 0){
System.out.println("Emprestimo valido");
}else{
System.out.println("Emprestimo invalido");
}
}
}
Pode-se pensar que é uma situação muito difícil de acontecer, mas num sistema que realiza milhares de transações a probabilidade de ocorrer aumenta. O funcionamento inadequado em uma transação pode ser um problema bastante sério.