I'd prefer to always have one internal representation of these numbers, and only change the visual representation on request to the current choice. That way I'd avoid this issue, and also I wouldn't have to worry about accummulating errors.
To capture the previous value, is a variant of capturing the current value. In sub change_unit you keep the old choice. When entering that sub, you have a new choice in $dtm_unit, and you have the old in your sub, or in a global, and you can recalculate from old to new, and set $old_unit = $dtm_unit; for use next time.