Duplicate of: round() for float in C++
I'm using VS2008 and I've included math.h but I still can't find a round function. Does it exist?
I'm seeing a bunch of "add 0.5 and cast to int" solutions on google. Is that the best practice?
I'm using VS2008 and I've included math.h but I still can't find a round function. Does it exist?
I'm seeing a bunch of "add 0.5 and cast to int" solutions on google. Is that the best practice?
That's right there is no round() function, but there is floor(), which always rounds to the lower number, and ceil(), which always rounds to the higher number.
To get the normal rounding behaviour, you would indeed use floor(i + 0.5).
This way will give you problems with negative numbers, a workaround for that problem is by using ceil() for negative numbers:
double round(double number)
{
return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}
Another, cleaner, but more resource-intensive, way is to make use of a stringstream and the input-/output-manipulators:
#include <iostream>
#include <sstream>
double round(double val, int precision)
{
std::stringstream s;
s << std::setprecision(precision) << std::setiosflags(std::ios_base::fixed) << val;
s >> val;
return val;
}
Only use the second approach if you are not low on resources and/or need to have control over the precision.
There actually isn't a round function in Microsoft math.h.
However you could use the static method Math::Round() instead.
(Depending on your project type.)
I don't know if it's best practice or not but using the 0.5 technique with a floor() seems to be the way to go.
Using floor(num + 0.5) won't work for negative numbers. In that case you need to use ceil(num - 0.5).
double roundToNearest(double num) {
return (num > 0.0) ? floor(num + 0.5) : ceil(num - 0.5);
}