There's a peculiarity that you have to be aware of when box-selecting and doing this resize operation.
The selection box isn't just a selection of keys. Its size has nothing to do with the first and last keys selected. The size is the actual size of the box you see, and includes the empty space before or after they keys you dragged around.
So if you started dragging from 41 down to 0, and then tried to resize it to half, it's actually the edge of your box that snaps to integer values. If you dragged 41 to 20 or 21, neither would result in a perfect 1/2 scale and, as a result, your keys won't land on integers.
HERE'S WHAT YOU CAN DO: Drag a box from 42 to 0. Then resize that box to 21. That should make your even keys land on integers, and the odd keys at half frames.
The behavior's a bit unexpected when you're used to other programs, but it's what it does. I think resizing itself is logical and useful. It scales the spacing between the keys according to how much the whole box was scaled. Just like in image editing programs like Photoshop.
But what's difficult to do right now is make a selection box starting from a key. Clicking and dragging a key moves it instead of making a selection including it.
The selection box limitation probably wouldn't matter if there we could type the desired scale in a box somehow. Like type: 0.5 and it'll scale to half no matter what our selection box is.
On another note, ALL keyframes are actually stored as fractions of seconds in the data. Frame 1 is 0.033333 seconds. Frame 15 is 0.5 seconds. 20.5 is actually a perfectly valid keyframe that translates to 0.68333 seconds. But I also agree that fraction frames are messy to work with and manipulate in the dopesheet, especially when you want things to align with each other.
In this sense, "frames" is ever so slightly misleading since this type of animation doesn't really deal with discrete slices of time.