in reply to
Previous Selection in Spinbox
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.