The best way to visualize how floating point numbers are inaccurate is to think in terms of base-10 "floating point" values. You can use up to ten consecutive nonzero digits, and place the decimal point arbitrarily. Examples:
1234567890 // nine digits, decimal point placed to multiply 123456789 with 10
2345678901 // ten digits
12345.6789 // nine digits, decimal point placed to divide by 10000.
0.000000123456789 // nine digits, divide by 10000000
The result of every operation must fit in the same schema:
1234567890
+ 0.000000123456789 // two legal inputs
= 1234567890.000000123456789 // give an unrepresentable output
= 1234567890 // which loses the least significant digits
- 1234567890 // subtract one of the numbers again
= 0 // the digits are lost forever
Basically, you can represent light years and millimeters, but adding a millimeter to a light year still gives you a light year. If you need more precision, you'd use an integer that is large enough that it can represent a light year in millimeters.