Building on Aisling's solution, if you are using an activity entity:
You already have a [Planned] Duration field, that is calculated as the difference between scheduledstart and scheduledend. You could use Actual Duration field instead, that uses actualstart and actualend. Notice that these are not usually on the activity form, but are filled in based on user marking activity as completed. Use whichever one makes most sense, and label them unambiguously for the user.
1) Add two new fields:
Hours Long - decimal, 10 places, not searchable or audited
Hours Duration - decimal, 2 places (or however many you think you need, noting that 1/4 hour needs two, but in some industries it is common to use 6 minute intervals to use only a single decimal)
You do not have to put these fields on the form. You could choose to put hours duration as well as or instead of the usual duration field, but make it read-only.
2) Create a real-time workflow, triggered when the activity record is created, or when duration changes.
Steps:
Check duration has a value
Update record: Hours long = duration
Update record again: Hours long - multiply by 0.0166666667 (this is why you need 10 decimal places)
Update record again: Hours = Hours long (this will do rounding up/down to nearest number in last place, not truncation)
Activate your workflow and test
3) Use your Hours duration field in reports, charts etc.
PS: You cannot do the above as a CRM 2015 calculated field, because duration fields are not supported.