I'd convert them to dates, and then use normal date arithmetic, eg
SQL> create table t(
2 s date,
3 st number(4,2),
4 e date,
5 et number(4,2)
6 );
Table created.
SQL>
SQL> insert into t values (sysdate,10.31,sysdate+3,17.47);
1 row created.
SQL>
SQL> select * from t;
S ST E ET
--------- ---------- --------- ----------
27-APR-17 10.31 30-APR-17 17.47
1 row selected.
SQL>
SQL> with t1 as
2 (
3 select
4 to_date(to_char(s,'yyyymmdd')||to_char(st,'fm00.00'),'yyyymmddhh24.mi') real_start,
5 to_date(to_char(e,'yyyymmdd')||to_char(et,'fm00.00'),'yyyymmddhh24.mi') real_end
6 from t
7 )
8 select
9 real_start,
10 real_end,
11 real_end - real_start,
12 trunc(real_end - real_start) days,
13 trunc(24*mod(real_end - real_start,1)) as hrs,
14 trunc( mod(mod(real_end - real_start,1)*24,1)*60 ) as mins
15 from t1;
REAL_STAR REAL_END REAL_END-REAL_START DAYS HRS MINS
--------- --------- ------------------- ---------- ---------- ----------
27-APR-17 30-APR-17 3.30277778 3 7 16
1 row selected.