"ceil" is a function that rounds up to the next whole number ("ceil" is shorthand for ceiling), so e.g. ceil(7.8) returns 8, while ceil(7) returns 7 (as 7 is already a whole number).
The individual terms of 3+7*0.9 + ceil(Weight-9)*0.7 mean the following:
-) The first 2kg are 3 Euro (the first term)
-) The next 7kg (each kg above 2, up to 9kg) are 0.9 Euro each, so 7*0.9 in total
-) Finally, each kg above 9kg is charged 0.7 Euro. Weight-9 is the weight exceeding 9kg, eg. 9.45 kg is 0.45 kg above 9kg. For this 0.45kg a full kg is charged, so we round it up to the next whole kg, which is exactly what ceil is doing.
To charge 1 Euro for every 0.5kg, you can simply multiply the weight by 2 and handle it similarly to the 1 Euro/kg case. Or you can first round up to the next 0.5kg and then multiply by 2:
Name=1 Euro per 1/2 kg above 3kg; Shipping=ceil(2*(Weight-3))
or equivalently:
Name=1 Euro per 1/2 kg above 3kg; Shipping=2*ceil(Weight, 0.5)-6
Regarding your request how to round the weight for display: You'll have to define a custom variable that stores the weight rounded to a given accuracy, e.g. rounded to the next 0.1 step. Note, however, that 2.551455 will be rounded to 2.6! Also, since you charge 1 Euro for each additional kg, ie. 2.01 will still count as 3 kg, you should not round to the nearest 0.1 kg step, but rather always round UP to the next 0.1kg step:
Variable=RoundedWeight; Value=ceil(Weight, 0.1)
Name=Your Order is {RoundedWeight}kg. ACS Net 2; ...
Best regards,
Reinhold