You should always think of the built in X and Y position values as being "write only" - always use alterable values to store an object's position coordinates as floats, and never retrieve an object's built in X or Y position (except in the rare case where you really do want the position it's actually drawn at instead).
I appreciate that the example above with the moving arrows is just to highlight a point, but it's not something you should ever be doing.
It should be:
Arrow: Set xPos to: xPos("Arrow") - 0.0001
Arrow: Set X position to xPos("Arrow")
...where "xPos" is an alterable value
As long as you're doing that, sub-pixel movements will work fine, and no object will ever be drawn more than 1 pixel out of position. Bear in mind that objects with negative positions are likely going to be offscreen anyway...
Personally, I use round() whenever setting an object's position (not during movement calculations, but when setting the final position), since that's the most accurate and will give the smoothest movement, and realistically, the performance difference is not going to be noticeable.