I once wrote a module to do this (long before DateTime). Note that in the second case the result is exact. Date::Tie is _very_ careful to round errors correctly.
use Date::Tie; tie my %date, 'Date::Tie', frac_hour => 2.67; print $date{frac_hour}, "\n"; print $date{hour}, ":", $date{minute}, ":", $date{frac_second}, "\n"; # 02.67 # 02:40:12.0 $date{frac_hour} = 2 + 2/3; print $date{frac_hour}, "\n"; print $date{hour}, ":", $date{minute}, ":", $date{frac_second}, "\n"; # 02.66666666666667 # 02:40:00.0 - Flavio S. Glock