如果x
和y
是double
,为什么我不能:
int nx = floor(x)
或 int ny = floor(y)
向下舍入为整数,这将与 int
?
最佳答案
即使我们只考虑整数,float
也可以存储 int
不能存储的值。例如,考虑这种情况:
float x = std::numeric_limits<int>::max() + 1f;
// Even floored, the value is out of range!
int y = floor(x);
甚至还有一些其他的特殊值,如正无穷大、负无穷大和 NaN,int
变量无法保存这些值。 (也有负零,但在标准中定义为等于正零,所以它设法通过。)
正因为如此,这种转换被认为是“缩窄”的,你必须应该显式地用强制转换来执行它(这样编译器和你程序的 future 维护者都知道它不是一个错误):
int y = static_cast<int>(floor(x));
“窄化转换”简单的说就是目标类型的域不是源类型域的子集,所以有一些输入无法在目标类型中准确表示。显式强制转换是您告诉编译器您愿意接受如果在目标类型中无法表示值的情况下执行转换的结果的方式。
另请注意,从浮点类型转换为整数类型时的默认行为是截断小数部分,因此 floor()
调用是多余的。你可以这样做:
int y = static_cast<int>(x);
关于c++ - 使用 floor 从 double 中获取整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667128/