我对将float/double变量四舍五入到最近的整数有些困惑。在谷歌搜索时,我发现了cppreference关于四舍五入的页面this。在该页面上,它说:
在这里,我不明白为什么返回值类型是
为了理解这个
然而,这让我更加困惑,因为一切都运行得很好。
所以,最后一个问题是:
在上面的代码中,
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)
在这里,我不明白为什么返回值类型是
float
、double
或long double
?例如,如果我有一个变量float x
和2.5 <= x < 3.5
,那么它的四舍五入值是3
。这可以用一个int
来表示,对吗?那么,为什么std::round
的返回值类型不是int
(或long int
用于long double
)呢?
在该页面上,还写道:
1-5) 计算最接近 arg(以浮点格式表示)的整数值,四舍五入到远离零的一侧,而不考虑当前的舍入模式。
那么,"integer value to arg (in floating-point format)" 究竟是什么意思?
为了理解这个
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;
}
然而,这让我更加困惑,因为一切都运行得很好。
所以,最后一个问题是:
在上面的代码中,
int rounded_var_int = std::round(var)
是可以的,还是需要显式地将其转换为 int
,例如 int rounded_var_int = static_cast<int>(std::round(var))
,以避免任何潜在的错误?
std::roundl
(或者也许是std::roundll
)来实现。 - Paul Sanders10^200
。 - NathanOliverstd::round
的结果足够大,在将其截断为int
时,是否会出现浮点错误并使您得到比预期少1的结果? - Paul Sandersround
函数返回整数类型会很方便。但这不是一般情况,将结果转换为整数类型是您不想总是付出的额外成本(特别是如果您打算再次转换为浮点类型)。如果您想要这样做,可以简单地将其转换为整数类型以进行截断,或者对您的值+0.5
执行相同操作以进行四舍五入,或者转换std::round
的结果。 - François Andrieux