Все это происходит из-за использования округления, потолка и пола.
Вы можете использовать что-то вроде ниже:
select convert(varchar(10), @hrAcc) + '.'+ right('0' + cast(cast((@Accrued-@hrAcc)*60 as int) as varchar),2)
select convert(varchar(10), @hrUsed) + '.'+ right('0' + cast(cast((@Used-@hrUsed)*60 as int) as varchar),2)
select cast((abs(cast(@hrAcc*60+cast((@Accrued-@hrAcc)*60 as int) as int) - cast(@hrUsed*60+cast((@Used-@hrUsed)*60 as int) as int)))/60 as varchar)
+'.'
+ cast((abs(cast(@hrAcc*60+cast((@Accrued-@hrAcc)*60 as int) as int) - cast(@hrUsed*60+cast((@Used-@hrUsed)*60 as int) as int)))%60 as varchar)
--- Тест (использование округленных значений вместо необработанных)
declare @Accrued decimal(9,4) = 0.5333--106.325--106.325--51.2568--49.9217--106.325--49.9217--24.60
declare @Used decimal(9,4) = 0.0333--87.885--87.885--49.9217--51.2568--87.88--51.2568--23.5734
declare @Remaining decimal(9,4) = @Accrued - @Used
declare @hrAcc int = @Accrued
declare @hrUsed int = @Used
declare @hrRem int = @Remaining
declare @RoundAccrued decimal(9,4) = ceiling(@Accrued * 100) / 100
declare @RoundUsed decimal(9,4) = ceiling(@Used * 100) / 100
declare @RoundRemaining decimal(9,4) = ceiling(@Remaining * 100) / 100
select convert(varchar(10), @hrAcc) + '.'+ right('0' + cast(cast((@RoundAccrued-@hrAcc)*60 as int) as varchar),2) Accrued
select convert(varchar(10), @hrUsed) + '.'+ right('0' + cast(cast((@RoundUsed-@hrUsed)*60 as int) as varchar),2) Used
select cast((abs(cast(@hrAcc*60+cast((@RoundAccrued-@hrAcc)*60 as int) as int) - cast(@hrUsed*60+cast((@RoundUsed-@hrUsed)*60 as int) as int)))/60 as varchar)
+'.'
+ cast((abs(cast(@hrAcc*60+cast((@RoundAccrued-@hrAcc)*60 as int) as int) - cast(@hrUsed*60+cast((@RoundUsed-@hrUsed)*60 as int) as int)))%60 as varchar) Remaining