To control the formatting of the output you can use printf either directly from awk or directly via the shell.
However you can also control the output directly using du. For example you can specify -h to output the results in human readable formats.
Examples
$ du -h --max-depth=1 /home/saml/apps | tail -1
9.0G /home/saml/apps
$ du -h --max-depth=1 /home/saml/apps/gCAD3D | tail -1
1.1M /home/saml/apps/gCAD3D
Formatting using printf
But as you've noticed you lose resolution with this method. So if you truly want to keep a higher degree of resolution, you're forced to take the values from du at a lower level, and then format the output to fit which ever higher level units you want.
Example
In MB's using du.
$ du -m --apparent-size --max-depth=1 /home/saml/apps | tail -1
8916 /home/saml/apps
Using awk + printf.
$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
tail -1 | awk -v D=$DIVISOR '{printf "%.9f\n", $1/D}'
0.870499638
You can control the amount of precision you want by changing the argument to printf. Here's 5 places.
$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
tail -1 | awk -v D=$DIVISOR '{printf "%.5f\n", $1/D}'
0.87050
Notice that it takes care to round it correctly where ever you decide to cut off the precision.