我正在使用 C(不是 C++)。
我需要将浮点数转换为
int
。我不想四舍五入到最接近的数字,我只是想消除整数部分后面的内容。类似的东西
4.9 -> 4.9-> 4
my_var = (int)my_var;
就这么简单。 基本上,如果变量是 int,则不需要它。
在C中使用
int C = var_in_float;
他们会隐式转换
如果您想截断(即,将正值舍入为较低值,将负值舍入为较高值),只需进行强制转换即可。
float my_float = 42.8f;
int my_int;
my_int = (int)my_float; // => my_int=42
my_float = -42.8f;
my_int = (int)my_float; // => my_int=-42
出于其他目的,如果你想将其四舍五入到最接近的值,你可以做一个小函数或像这样的定义:
#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
float my_float = 42.8f;
int my_int;
my_int = FLOAT_TO_INT(my_float); // => my_int=43
my_float = -42.8f;
my_int = FLOAT_TO_INT(my_float); // => my_int=-43
my_float = 42.2f;
my_int = FLOAT_TO_INT(my_float); // => my_int=42
my_float = -42.2f;
my_int = FLOAT_TO_INT(my_float); // => my_int=-42
请小心,理想情况下您应该在投射之前验证浮动是否在 INT_MIN 和 INT_MAX 之间。
double a = 100.3;
printf("%f %d\n", a, (int)(a* 10.0));
Output Cygwin 100.3 1003
Output MinGW: 100.3 1002
使用 (int) 将 double 转换为 int 似乎不是万无一失的
您可以在这里找到更多相关信息:Convert double to int?
好客! ——我还没有为我的案件找到满意的答案, 我在这里提供的答案对我有用,但可能无法证明未来......
如果使用 gcc(clang?)并定义了
-Werror
和 -Wbad-function-cast
,
int val = (int)pow(10,9);
将会产生:
error: cast from function call of type 'double' to non-matching type 'int' [-Werror=bad-function-cast]
(出于充分的理由,需要考虑溢出和值舍入的情况)
编辑:2020-08-30:所以,我的用例将返回 double 的函数的值转换为 int,并选择 pow() 来表示该值 某处的私有函数。然后我更多地回避了 pow() 的思考。 (请参阅更多评论,了解为什么下面使用的 pow() 可能会出现问题......)。
经过深思熟虑(pow() 的参数很好),
int val = pow(10,9);
似乎适用于 gcc 9.2 x86-64 ...
但请注意:
printf("%d\n", pow(10,4));
可以输出例如
-1121380856
(为我做的)在哪里
int i = pow(10,4); printf("%d\n", i);
印刷
10000
在一个特定的情况下我尝试过。