使用floor从double获取整数

时间:2017-04-27 20:12:57

标签: c++

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

int nx = floor(x)int ny = floor(y)向下舍入到可与int一起使用的整数?

4 个答案:

答案 0 :(得分:4)

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

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

// Even floored, the value is out of range!
int y = floor(x);

甚至还有其他一些特殊值,如正无穷大,负无穷大和NaN,int变量无法容纳。 (也有负零,但是在标准中定义为等于正零,所以它设法发出吱吱声。)

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

int y = static_cast<int>(floor(x));

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

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

int y = static_cast<int>(x);

答案 1 :(得分:1)

你必须将结果转换为int,以便将它存储到一个...

int nx = (int)(floor(x));

答案 2 :(得分:0)

您必须了解您的价值观的域名。如果您在评论中说,您使用的是双重超载(请参阅cppreference了解完整详情),那么确实可能会丢失数据。

double可以表示高达约1e308的数字,但高于约1e17,则没有小数部分。 int只能管理大约2e9。因此,如果您知道您的域名永远不会超过20亿,那么使用它应该是安全的,您可以忽略警告或使用强制转换使其消失。

答案 3 :(得分:0)

double d = 1.5;
int i = d;

第二个初始化会截断浮点值并将结果存储到i中。此处的结果是有效且定义明确的:i获取值1.(如果结果值无法在int中表示,则行为将是未定义的;事实并非如此这里)。

警告告诉您转换会丢失信息。这是正确的,因为像1.4和1.5这样的值都将被转换为1,所以你将无法再区分它们。新的术语是缩小转换率#34;。但尽管有警告,转换是合法的。除了安静的过度热心的编译器之外,这里不需要演员。当然,除非您将编译器设置为将警告转换为错误,否则您将花费​​大量时间来说服如何说服编译器编译有效且有意义的代码,而某些编译器 - 编写者认为这些代码应该得到警告。