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?
You may use C++11's std::round()
.
If you are still stuck with older standards, you may use std::floor()
, which always rounds to the lower number, and std::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.
copysignf(floorf(fabs(x) + 0.5f), x)
as it's branchless and the code that simulates the branch is literally bin-ops (abs
-> &~0x80000000
, copysign is a bit transfer, etc) –
Tactless trunc
and boost
available. Also see my link's to Pascal Cuoq's articles on why rolling your own can be very tricky. –
Footworn round(-0.0)
, this answer returns 0.0
. -0.0
may be expected. –
Twopenny 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);
}
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.
© 2022 - 2024 — McMap. All rights reserved.