Are you sure that's sprintf behaviour, or is there a limitation in the IEEE floating point representation of 1.5050 that has it leaning on the low side of 0.0050? That's the only explanation I can think of as to why sprintf would be broken like this.