O porque disso é o seguinte.
O computador não trabalha bem com casas decimais. Como você sabe, os dados são representados internamente no formato binário.
O número 4, por exemplo, é representado pelo computador assim:
100 (onde 1x2^2 + 0x2^1 + 0x2^0 = 4)
Como é representado um número menor que zero? Cada casa após a vírgula representa os valores 1/2 (2^-1), 1/4 (2^-2), 1/8 (2^-3) e assim sucessivamente.
Então, os números 4,25 0,5 e 4,75 ficam assim em binário:
100,01 100,10 100,11
Que problema que você tem aí? O computador é muito pobre em representações de casas decimais. Tente representar 0,3.
Isso é 0,25 + 0,03125 + 0,009765635…
Para contornar o problema, o que se faz é o seguinte. Faz-se os cálculos com um número grande de casas decimais. E depois arredonda-se o resultado. Por isso diz que que contas em float e double são imprecisas. Os tipos primitivos estão sujeitos a precisão do processador. Alguns processadores chegam a 50 bits, o que já é suficiente para a maior parte das aplicações.
Entretanto, muitas vezes não é suficiente. O java fornece classes para que você manipule números de precisão arbitrária. Nesse caso, os calculos são feitos por software, e são muito mais lentos. Mas ainda sim, quebram um galhão.
Isso explica o porque da sua multiplicação ter retornado aquele 3 estranho lá no final do número.