开发者

Float increments precision problems with UI

开发者 https://www.devze.com 2023-01-22 16:16 出处:网络
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.1000000014901161

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.


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.


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);
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号