I just verified my key bindings and they're at the defaults (e.g., PageUp binds to pageUp:). I tried binding to movePageUp: just to verify. What I'm seeing is different than what you've described. Perhaps I've altered some other binding, but heck if I can find it.
As long as the caret is on the center line, I get the behavior you describe. If the caret is not on the center line then I get other behavior. For example, if display is showing lines 283-364 (so, 82 lines per page), if the caret is on line 323 (the center) and I page up, the windows displays lines 201-282 (that is, it's move backward by 82 lines. However, if the caret is on line 360 (below center) and I page up, the window displays (roughly) lines 237-319 and the caret is on line 278. It's moving backward one page as measured from the caret location (360 - 82 = 278) and then making that line the center. The visual effect is a movement of more/less than a whole page depending on how far from center you are.
It seems that Xcode and TextMate do the same, while BBEdit moves a strict page up/down (perhaps leaving the caret outside of the visible window). If I could request something, what I would prefer is to always move exactly one page up/down based on the window size alone, regardless of where the caret is. If that leaves the caret outside the window, well, Ok. It'd be cool if the caret would land on the same relative position on the newly displayed page (e.g., if displaying 100-200 with caret on 175, a page down would display 200-300 with caret on 275).
Is this making sense? Are there defaults or bindings I can change to obtain this effect?