Don't forget that floating point numbers are just rational approximations, you can't get around issues of precision.
CL-USER> (integer-decode-float .2d0)
7205759403792794
-55
1
CL-USER> (integer-decode-float .2)
13421773
-26
1
Your implementation may not have the exact same representations as mine, but it doesn't matter. Fundamentally he issue is this:
CL-USER> (/ 7205759403792794 13421773)
7205759403792794/13421773
i.e., the double-float representation of 2/10 is not divisible by the single-float representation of 2/10. But look at your coerced version:
CL-USER> (integer-decode-float (coerce .2 'double-float))
7205759511166976
-55
1
CL-USER> (/ 7205759511166976 13421773)
536870912
In order to coerce your .2 to double float, youscale the significand to the new representation, and adjust the exponent as needed. You don't have the real number ".2" around to return to. This has nothing to do with lisp per se, it's in the nature of floating point representations.
Hope that makes sense.