tags:

views:

55

answers:

2

Here is my problem, I have several parameters that I need to increment by 0.1. But my UI only renders x.x , x.xx, x.xxx for floats so since 0.1f is not really 0.1 but something like 0.10000000149011612 on the long run my ui will render -0.00 and that doesn't make much sense. How to prevent that for all the possible cases of UI.

Thank you.

+5  A: 

Use integers and divide by 10 (or 1000 etc...) just before displaying. Your parameters will store an integer number of tenths, and you'll increment them by 1 tenth.

xscott
+2  A: 

If you know that your floating point value will always be a multiple of 0.1, you can round it after every increment to make sure it maintains a sensible value. It still won't be exact (because it physically can't be), but at least the errors won't accumulate and it will display properly.

Instead of:

x += delta;

Do:

x = floor((x + delta) / precision + 0.5) * precision;

Edit: It's useful to turn the rounding into a stand-alone function and decouple it from the increment:

inline double round(double value, double precision = 1.0)
{
    return floor(value / precision + 0.5) * precision;
}

x = round(x + 0.1, 0.1);
Mark Ransom