如何在c ++中将变量四舍五入到n位小数

Reg*_*ser 2 c++ floating-point-precision

我有一些float变量会产生像 1.23456789 这样的值。我想把它四舍五入到小数点后 4 位。

setprecision 函数只对输出进行舍入,但我想更改变量本身的值。

所以我正在寻找类似的东西

x=roundoff(x,n)
Run Code Online (Sandbox Code Playgroud)

其中 roundoff 会将 x 舍入到 n 位小数。

gcs*_*osh 5

为什么不是这个?

  float val = 1.23456789

  float rounded_down = floorf(val * 1000) / 1000;   /* 1.2345 */
Run Code Online (Sandbox Code Playgroud)

编辑:

正如评论中指出的,请记住,这是一个近似值,但在许多情况下可能是可以接受的。另外,您可能需要四舍五入到最接近的值或向上舍入,如下所示:

  float val = 1.23456789

  float near = roundf(val * 1000) / 1000;   /* nearest */
  float up = ceilf(val*1000) / 1000; /* up*/
Run Code Online (Sandbox Code Playgroud)


Rob*_*son 5

这对 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);
}
Run Code Online (Sandbox Code Playgroud)

对于double,上面的结果是1000.123000000,浮点数是1000.12299。