I was having trouble sleeping one night, so I decided to bore myself to sleep by coming up with a way to round a number to any decimal place without using printf(). The solution I came up with also lets you round to any place at all (like 10s, 100s, etc.)
To use this, call round() with the number you want to round, followed by a multiple of 10 describing to which place you want to round to (10 rounds to the nearest 10, .1 to the nearest 10ths, .001 to the nearest thousandth place... you get the idea).
By the way, I benchmarked this and it is marginally faster than printf().
In chatterbox, I (belatedly) noticed Adam wonder why his code failed for
round(-4.35,0.1). I think the reason helps to illustrate
why I didn't worry about rounding to the nearest even. I can sum up
the situation pretty easily with this:
A floating point number can never be exactly 0.05. Floating point
numbers are represented in binary and have a limited number of bits.
0.05 in binary requires an infinite number of bits (forming a repeating
pattern, similar to how 1/7 is 0.142857142857... in decimal). So
the extra code to round to the nearest even will probably never trigger
when rounding to 1 or more places after the decimal point (I say
"probably" because I don't claim to be able to predict the interactions
of limited floating point precision on the calculations being done
and it is possible that things would cancel out and trigger the
extra code, perhaps in cases where it really shouldn't have).