c++ - 使用 floor 从 double 中获取整数

标签 c++

如果xydouble,为什么我不能:

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/

相关文章:

c++ - 运行时的动态库与静态库

c++ - 依赖于其他静态库的静态库

c++ - 自制删除如果是空间

c++ - 在 C/C++ 中分配和访问矩阵

c++ - 声明具有所有虚函数的类的对象

c++ - 如果线程分离,我是否需要终止它?

c++ - 复制赋值运算符中按值传递与按引用传递

c++ - 如何将指针映射公开为 const 指针映射?

c++ - 变量名中的 __COUNTER__

c++ - 参数的重载函数(不可)在编译时推导