为什么 std::round 的返回值类型不是整数?

Mil*_*lan 4 c++ casting rounding type-conversion

float我对将/double变量舍入到最接近的整数有一些困惑。在谷歌搜索时,我发现了这个用于四舍五入的 cppreference 页面。在那一页上,写着:

float       round ( float arg );         // (1)
float       roundf( float arg );         // (2)
double      round ( double arg );        // (3)
long double round ( long double arg );   // (4)
double      round ( IntegralType arg );  // (5)
Run Code Online (Sandbox Code Playgroud)

这里,我不明白为什么返回值类型是float, double, 或long double?例如,如果我有一个变量float x2.5 <= x < 3.5那么它的舍入值为3。这可以只用 来表示int,对吗?那么,为什么返回值类型std::round不是 an int(或long itfor long double)?


在那一页上,还写着:

1-5) 计算最接近 arg 的整数值(采用浮点格式),将中间情况舍入到远离零的位置,无论当前舍入模式如何。

那么,“arg 的整数值(浮点格式)”究竟是什么意思?


为了理解这一点std::round,我做了一个小实验:

int main(int argc, char const *argv[]) {
    float var               = 3.14;
    int   rounded_var_int   = std::round(var);
    float rounded_var_float = std::round(var);

    std::cout << rounded_var_int << ", " << rounded_var_float << std::endl;  // 3, 3
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,这让我更加困惑,因为一切都进行得很好。

所以,最后一个问题:
在上面的代码中,int rounded_var_int = std::round(var)就可以了,还是我需要将其显式转换为integint rounded_var_int = static_cast<int>(std::round(var))以避免任何潜在的错误?

eer*_*ika 5

为什么 std::round 的返回值类型不是整数?

因为浮点类型的可表示范围通常超出了基本整数类型的范围,因此这些整数类型无法表示所有潜在的返回值。

除了超出整数类型范围的有限舍入值之外,其他有问题的值是无穷大、非数字值、负零,这些值将不做任何更改地返回。

四舍五入后的值为 3。这可以仅使用 int 来表示,对吗?

值可以使用 来表示int。但仅仅能够表示一个或某些值是不够的。返回类型应该能够表示所有舍入值。而这通常是无法通过int.

在上面的代码中,int rounded_var_int = std::round(var)就可以了,还是我需要将其显式转换为 int 例如int rounded_var_int = static_cast<int>(std::round(var))以避免任何潜在的错误?

浮点类型可以隐式转换为整数类型。隐式转换的结果与静态转换的结果相同。

这是一个缩小的转换。隐式转换和显式转换都不安全,因为如果浮点值超出可表示范围,则程序的行为是不确定的。这两种转换都是安全的,因为如果该值是可表示的,则转换后该值将保持不变。