There are 21 million bitcoins and they divide down to 8dp, so you need 16 decimal digits to represent them exactly. Coincidentally (?) double precision floating point is capable of precisely representing exactly 16 decimal digits.
http://en.wikipedia.org/wiki/Double_precision
So using double is in fact perfectly OK in this case.