Please read for an updated status on RailsCasts:
Learn more or hide this
GitHub User: alexreisner
Check out MySQL spatial extensions and PostGIS.
In general I think of single-precision floats as being precise to approximately a city block. Double-precision floats should be accurate to within inches.
Calculations with decimals are slower so I don't recommend them unless you need some really extreme precision (in which case you should probably be using a proper geospatial datastore).
Geocoder is lighter, easier to use, and has features missing from GeoKit like built-in result caching. It's also designed to be compatible with more storage engines (like MongoDB) and environments (JRuby, Rack, SQLite, etc).
GeoKit has been around longer but Geocoder is also production quality.
Geocoder currently supports Google, Yahoo, Bing, Yandex and Geocoder.ca APIs for street address geocoding. Geocoder.ca is free but only provides data for the US and Canada. Easy enough to configure:
Geocoder::Configuration.lookup = :geocoder_ca
The Geocoder README has a table comparing the features of the various APIs.