Python, 125 bytes
After deleting my 1st answer (sry!) which could not handle small numbers due to machine epsilon issues, I found a different solution. It handles float as well as integers, trailing zeros (!) and is written as function.
Thanks to @ogaday for the useful hints and for the compact '0'-fix!
Golfed:
def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return'+'.join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if'0'<o])or'0'
Ungolfed:
def f(x):
x+='.'
i=x.find('.')
z=list(x)
del z[i]
return '+'.join([str(int(o)*10**(i-j-1)) for j,o in enumerate(z) if '0'<o]) or '0'
Usage:
>>> f("0")
'0'
>>> f("32.005")
'30+2+0.005'
>>> f("100020003000009000000.0007")
'100000000000000000000+20000000000000000+3000000000000+9000000+0.0007'
>>> f("1000000000009000000.0007000000000000000002")
'1000000000000000000+9000000+0.0007+2e-22'
>>> f("0001.99")
'1+0.9+0.09'