我正在使用 C(而非C ++)。
我需要将一个浮点数转换为int
。我不想四舍五入到最接近的数字,我只想消除整数部分后面的内容。类似这样:
4.9 -> 4.9-> 4
我正在使用 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
如果您需要将其四舍五入到最接近的数,您可以创建一个小函数或定义如下:
#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
注意,最好在强制转换前验证浮点数是否在 INT_MIN 和 INT_MAX 之间。
FLOAT_TO_INT(rand())
,它会表现出奇怪的行为,最好将其作为一个函数来定义。 - DownloadPizza#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
中的字面值 0.5
是一个 double
,而你真正需要的是 float
。建议更改为:#define FLOAT_TO_INT(x) ((x)>=0.0f?(int)((x)+0.5f):(int)((x)-0.5f))
。 - user3629249(int)
截断小数部分。 - chux - Reinstate Monica(x)+0.5f
可能会给出错误的四舍五入结果。 (x)+0.5
通过使用更宽的 double
数学避免了这种情况。使用 IAC lroundf()
、roundf()
更好。 - chux - Reinstate Monicadouble 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 似乎不是一个安全的方法。
你可以在这里找到更多相关信息:将 double 转换为 int?
float
转换为 int
,而不是 double
转换为 int
。 - user3629249float
,但是在这里仅使用float
的示例会更好。 - chux - Reinstate Monica好问题!-- 对于我的情况,我还没有找到令人满意的答案, 但我在这里提供的答案适用于我,但可能不具备未来的可靠性...
如果使用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
在我尝试的一个特定情况中。
%d
打印它的原因。而且,使用pow来实现这个目的是错误的,因为它可能会对整数返回不正确的结果。使用1e4代替,以获得10^4。参见为什么gcc编译器将pow(10,2)输出为99而不是100?,为什么pow(10,5)=9,999在C++中?,为什么pow(5,2)变成了24?。 - phuclv1e6
的情况,但是(像往常一样)我使用了 printf("%d\n", 1e6);
进行测试,结果得到了奇怪的结果。如果确定 const int million = 1e6
是安全的,我会开始使用这样的格式。 - tomi1e6
依赖于编译器进行高质量的 double
到 int
转换。比 pow()
更不可能出现问题,但我没有看到 C 规范保证最佳答案。 (int)1e6
的替代方案:为什么在 C 中将 1,000,000,000 写成 100010001000? 和 为什么不安全。 - chux - Reinstate Monica10e4
相比,pow()
函数不太好(需要通过编辑提交进行修复)。我想知道为什么10e4
是double
而不是int
,然后尝试了1.12e1
和12e-3
来理解。 - tomi
int
转换为二进制数”的意思——int
本身就是二进制的……或者你是想将它转换为二进制表示的字符串,例如将14
转换为"1110"
。无论哪种方式:浮点数是如何涉及到这个转换的? - mafso5 / 2
计算结果为2
,而不是2.5
。 - mafso