This is mostly because IP address -> location databases are not updated in real time with what ISP's actually allocate. It is conceivable that a single /20 or /22 block serves a 10 mile region of customers, or approximately 10 - 15 DSLAM units.
Services such as Maxmind typically keep close to in sync with IP allocation changes, and have a very high accuracy rate by city. However, lat / long for any given IP address could jitter by 5 - 10 miles, depending upon who receives that IP from any given ISP, in any given city.
The larger the actual subnet, the larger the jitter where this is concerned. For instance, an ip on a /16 block could literally be anywhere in a given 30 mile radius especially if the ISP assigns a new IP on each connection. It is seldom that they allocate that way, but some do. There's no way to keep a database in sync with such a moving target.