使用 floor 从 double 中获取整数

pas*_*uce 2 c++

如果xydouble,为什么我不能这样做:

int nx = floor(x)或者int ny = floor(y)向下舍入到可以使用的整数int

cdh*_*wie 6

即使我们只考虑整数,float也可以存储不能存储的值int。例如,考虑这种情况:

float x = std::numeric_limits<int>::max() + 1f;

// Even floored, the value is out of range!
int y = floor(x);
Run Code Online (Sandbox Code Playgroud)

甚至还有一些其他特殊值,例如正无穷大、负无穷大和 NaN,这是int变量无法容纳的。(也有负零,但在标准中定义为等于正零,因此它设法吱吱作响。)

因此,这种转换被认为是“缩小范围”,您必须使用强制转换显式执行它(以便编译器和程序的未来维护者都知道这不是错误):

int y = static_cast<int>(floor(x));
Run Code Online (Sandbox Code Playgroud)

“窄化转换”只是意味着目标类型的域不是源类型域的子集,因此有一些输入无法在目标类型中准确表示。显式强制转换是告诉编译器您愿意接受如果在目标类型中无法表示值的情况下执行转换的后果的方式。


另请注意,从浮点类型转换为整数类型时的默认行为是截断小数部分,因此floor()调用是多余的。你可以这样做:

int y = static_cast<int>(x);
Run Code Online (Sandbox Code Playgroud)