C将浮点数转换为int

Ser*_*res 17 c floating-point int casting type-conversion

我正在使用C(不是C++).

我需要将一个浮点数转换成一个int.我不想舍入到最接近的数字,我只是想消除整数部分之后的内容.就像是

4.9 -> 4.9 -> 4

Zac*_*h P 30

my_var = (int)my_var;
Run Code Online (Sandbox Code Playgroud)

就如此容易.如果变量是int,基本上你不需要它.

  • 确保你为负数和大数做你想做的事.事情可能会更复杂.如果浮点数是正数且小于平台上的最大整数,则可以安全. (3认同)
  • 这很好,但这也是未定义的行为。 (2认同)

Adr*_*riZ 9

如果你想把它四舍五入到更低,就投吧。

float my_float = 42.8f;
int my_int;
my_int = (int)my_float;          // => my_int=42
Run Code Online (Sandbox Code Playgroud)

出于其他目的,如果你想把它四舍五入到最近,你可以做一个小函数或这样的定义:

#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
Run Code Online (Sandbox Code Playgroud)

小心,理想情况下,您应该在转换之前验证浮点数介于 INT_MIN 和 INT_MAX 之间。

  • 此贡献没有回答明确说明“我不想四舍五入到最接近的数字”的问题的问题。 (3认同)
  • 将宏与逻辑结合使用并不是非常聪明,因为人们倾向于将它们视为函数。例如,如果你要使用“FLOAT_TO_INT(rand())”,它会表现得很奇怪,最好将其设为函数 (3认同)
  • 关于: `#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))` 这些文字 `0.5` 是一个 `double`你真的想要“浮动”。建议:`#define FLOAT_TO_INT(x) ((x)>=0.0f?(int)((x)+0.5f):(int)((x)-0.5f)) (3认同)
  • 对于负值,“将其舍入为较低”是不正确/不清楚的。`(int)` 截断分数。 (3认同)
  • @user3629249 当总和不精确时,“(x)+0.5f”可能会给出错误的舍入结果。`(x)+0.5` 通过使用更广泛的 `double` 数学来避免这种情况。IAC `lroundf()`、`roundf()` 更好。 (2认同)

小智 6

在C中使用

int C = var_in_float;
Run Code Online (Sandbox Code Playgroud)

他们将隐含转换

谢谢


Leg*_*egu 6

double a = 100.3;
printf("%f %d\n", a, (int)(a* 10.0));

Output Cygwin 100.3 1003
Output MinGW: 100.3 1002
Run Code Online (Sandbox Code Playgroud)

使用 (int) 将 double 转换为 int 似乎不是万无一失的

您可以在这里找到更多相关信息:Convert double to int?