For option #1, I don't believe a date formatter is involved. Possibly under the hood, but I imagine it's not broken. The date is stored in ISO 8601 form.
For option #2, use -setDouble:forKey: and -doubleForKey instead of the float-based versions. That might be the cause of your precision errors.