Grundsätzlich würde ich das ursprüngliche Problem so lösen :
xr := trunc(x * 20 + 5) / 20
Dein Anwendungsfall muss aber
IMHO anders gelöst werden!
Laut Gesetz ...
BUrlG § 5 Teilurlaub
Absatz 2 :
Bruchteile von Urlaubstagen, die mindestens einen halben Tag ergeben, sind auf volle Urlaubstage aufzurunden.
... werden also Werte von x,5 bis x,999999... auf x+1 aufgerundet !
Von kaufmännischem Runden ( schon gar nicht auf halbe Tage ) steht da nix.
Man kann dem Arbeitnehmer natürlich mehr Urlaub geben als ihm eigentlich zusteht, wenn z.B. einen Anspruch von x,000000001 bis x,499999... auf x,5 aufgerundet würde:
xr := trunc(x * 20 + 9) / 20
Gesetzlich müsste man tatsächlich z.B. nur 0,1 Tage Urlaub gewähren *lol*
Übrigens: Dein Beispiel mit dem 15. Mai ergibt nur einen Urlaubsanspruch von 16,333... Tagen und nicht 17,672131147541 Tage , weil angebrochene Monate nicht zählen!