Dúvida com lógica de exercício

No livro de Deitel tem esse exercício.
Um estacionamento cobra um taxa mínima de $ 2 para estacionar por até 3 horas. Um adicional de $0,50 por hora não necessariamente inteira é cobrado após as três primeiras horas. A carga máxima para qualquer dado período de 24 horas é de $10. Suponha que nenhum carro fica estacionado por mais de 24 horas por vez. Escreva um aplicativo que calcule e exiba as taxas de estacionamento para cada cliente atual e calcular e exibir o total dos recibos de ontem. O programa deve utilizar o método calculaCustos para determinar a cobrança para cada cliente.

E tem a seguinte resposta.

[code]public class Estacionamento {

double custo = 2;
private double tempo_estacionado;

public Estacionamento(double tempo) {
    tempo_estacionado = tempo;
    }
    
public double calculaCustos()   {
    double pagar;
    if (tempo_estacionado <=3.0)
        pagar = 2.0;
    else if (tempo_estacionado <=19.0)
        pagar=(custo+(0.50)*Math.ceil(tempo_estacionado - 3.0));
    else
        pagar = 10.0;
    return pagar;
}[/code]

A minha dúvida é nessa parte: pagar=(custo+(0.50)*Math.ceil(tempo_estacionado - 3.0));
Suponhamos que fique no estacionamento 7 horas. O aplicativo deveria somar 2 reais das primeira 3 horas e depois somar mais 0,50 por hora.
O que daria 4 reais. A lógica acima dá certo mas não consigo compreendê-la.

pagar=(custo+(0.50)*Math.ceil(tempo_estacionado - 3.0));

bom…vamos separar a conta em 2…

Math.ceil(tempo_estacionado - 3.0)

isso aqui vai ver por qual periodo que esta pagando.

lembra que o valor do tempo era arredondado pra cima?

pois é, esse metodo ceil arredonda pra cima, sendo assim se o kra fica 6 horas e cinco minutos, ele paga por 7 (assim como esse metodo garante).

observe q ai, só esta calculando a parte do tempo que ficou “acima” das 3 horas, pq isso deve ser calculado separadamente(nesse caso esta calculando o referente as 4 horas adicionais).

agora vamos adicionar um pouco mais da conta:

(0.50)*Math.ceil(tempo_estacionado - 3.0)

perceba que calculado o tempo acrescido das “3 horas de preço padrão”, calculamos o preço desse tempo, e por fim a conta toda:

custo+(0.50)*Math.ceil(tempo_estacionado - 3.0)

tendo calculado quanto se paga pelo tempo adicional, basta somar a isso o valor das 3 primeiras horas, que se encontra na variavel custo(olhe na declaração dela).

Agora entendi obrigado. O cálculo é feito da direita para esquerda.