Olá
As respostas da Bani e do Louds já dizem tudo. Inclusive a Bani tocou em um ponto que o exemplo da sua pergunta quase deixa escapar. Vou contar um pouco de história para explicar minha resposta.
Quando os computadores digitais apareceram as primeiras aplicações foram com cálculos científicos. Nem todos os números reais podem ser representados de forma exata sob a forma binária mesmo que se use milhares de bits. Então lá nos primórdios da computação todo mundo estudava a questão dos erros. A gente queria saber quanto nossa solução via computador estava distante do valor exato. Como a Bani disse, muitas vezes os dados não eram tao exatos assim e ainda havia a questão de propagação de erros nos cáculos sucessivos. No final a gente tentava acreditar que nossos resultados eram exatos a menos de um valor muito pequeno, geralmente chamado de épsilon, que era a margem de erro.
Já quando se trata de grana ninguém quer seu valor errado a menos de épsilon nenhum. No caso do seu exemplo com 120.00001 tudo bem pois o erro foi para mais e arredondando daria certo. Mas se fosse 119.999999 ao arredondar se perderia pelo menos um centavo. Então já naquela época os cáculos financeiros não eram feitos com números reais. Usam-se os chamados números decimais onde as contas apesar de mais lentas não perdiam dígito nenhum. Os decimais eram representados na época de 2 modos: 1 dígito por byte ou 2 dígitos por byte. Assim, mesmo que a conta envolvesse aqueles valores absurdos do tempo em que convíviamos com inflação e qualquer Zé Ninguém ganhava milhões, nenhum centavo se perdia porque os valores ocupavam muitos bytes. A aritmética neste caso não podia usar as instruções de máquina da CPU para as contas. Se usava uma aritmética toda especial e muito mais lenta.
Com o Java, do mesmo modo que com qualquer linguagem, as contas com números de ponto flutuante podem ser feitas de 2 modos como disse o Louds:
a) Usando aritmética de ponto flutuante mas sempre contando com um pequenino erro. Os números que resultam de contas nunca são comparados por igualdade e sim a menos de um valor muito pequeno. Exemplo:
public class TestPrintln {
public strictfp static void main (String[] args) {
byte b1 = 100;
float f1 = 1.2f;
System.out.println(f1*b1);
float epsilon = 1.0e-06f;
if (Math.abs(f1 - 120.0f) < epsilon)
System.out.println("f1 * b1 = 120.0");
}
}
Ou usando aritmética do tipo decimal usando a classe BigDecimal
[]s
Luca