如何在C ++中将变量四舍五入到小数点后n位
How to round off a variable to n decimal places in c++
我有一些 float
变量会产生像 1.23456789 这样的值。我想四舍五入到小数点后 4 位。
setprecision函数只输出四舍五入,但我想改变变量本身的值。
所以我正在寻找类似
的东西
x=roundoff(x,n)
四舍五入会将 x 舍入到 n 位小数。
为什么不是这个?
float val = 1.23456789
float rounded_down = floorf(val * 1000) / 1000; /* 1.2345 */
编辑:
正如评论中所指出的,请记住这是一个近似值,但在许多情况下它可能是可以接受的。
另外,您可能希望舍入到最接近的值或按如下方式向上舍入:
float val = 1.23456789
float near = roundf(val * 1000) / 1000; /* nearest */
float up = ceilf(val*1000) / 1000; /* up*/
这对于 double 还算可以,但对于 float 不太准确。就个人而言,如果我想将数字指定为某种固定精度,我通常会使用某种定点表示法(整数 + 除数)。
#include <cmath>
template<class T>
static T Round(T a)
{
static_assert(std::is_floating_point<T>::value, "Round<T>: T must be floating point");
return (a > 0) ? ::floor(a + static_cast<T>(0.5)) : ::ceil(a - static_cast<T>(0.5));
}
template<class T>
static T Round(T a, int places)
{
static_assert(std::is_floating_point<T>::value, "Round<T>: T must be floating point");
const T shift = pow(static_cast<T>(10.0), places);
return Round(a * shift) / shift;
}
int main()
{
auto x = -1000.123;
auto result = Round(x, 3);
}
对于 double,上面的结果是 1000.123000000,带浮点数是 1000.12299。
float roundoff(float value, unsigned char prec)
{
float pow_10 = pow(10.0f, (float)prec);
return round(value * pow_10) / pow_10;
}
请记住,在某些情况下,由于浮点数在内存中的表示方式,结果并不总是准确的。
我有一些 float
变量会产生像 1.23456789 这样的值。我想四舍五入到小数点后 4 位。
setprecision函数只输出四舍五入,但我想改变变量本身的值。
所以我正在寻找类似
的东西x=roundoff(x,n)
四舍五入会将 x 舍入到 n 位小数。
为什么不是这个?
float val = 1.23456789
float rounded_down = floorf(val * 1000) / 1000; /* 1.2345 */
编辑:
正如评论中所指出的,请记住这是一个近似值,但在许多情况下它可能是可以接受的。 另外,您可能希望舍入到最接近的值或按如下方式向上舍入:
float val = 1.23456789
float near = roundf(val * 1000) / 1000; /* nearest */
float up = ceilf(val*1000) / 1000; /* up*/
这对于 double 还算可以,但对于 float 不太准确。就个人而言,如果我想将数字指定为某种固定精度,我通常会使用某种定点表示法(整数 + 除数)。
#include <cmath>
template<class T>
static T Round(T a)
{
static_assert(std::is_floating_point<T>::value, "Round<T>: T must be floating point");
return (a > 0) ? ::floor(a + static_cast<T>(0.5)) : ::ceil(a - static_cast<T>(0.5));
}
template<class T>
static T Round(T a, int places)
{
static_assert(std::is_floating_point<T>::value, "Round<T>: T must be floating point");
const T shift = pow(static_cast<T>(10.0), places);
return Round(a * shift) / shift;
}
int main()
{
auto x = -1000.123;
auto result = Round(x, 3);
}
对于 double,上面的结果是 1000.123000000,带浮点数是 1000.12299。
float roundoff(float value, unsigned char prec)
{
float pow_10 = pow(10.0f, (float)prec);
return round(value * pow_10) / pow_10;
}
请记住,在某些情况下,由于浮点数在内存中的表示方式,结果并不总是准确的。