C将浮点数转换为int
Posted
技术标签:
【中文标题】C将浮点数转换为int【英文标题】:C convert floating point to int 【发布时间】:2014-09-03 13:57:06 【问题描述】:我正在使用 C(不是 C++)。
我需要将浮点数转换为int
。我不想四舍五入到最接近的数字,我只是想消除整数部分之后的内容。类似的东西
4.9 -> 4.9-> 4
【问题讨论】:
理发已经够了——你需要的只是一个演员 我不明白您所说的“将int
转换为二进制数”是什么意思—int
已经是 二进制... 还是您的意思是转换它到二进制表示的字符串,例如将14
转换为"1110"
。无论哪种方式:浮点数是如何进入该转换的?
阅读用户 3195614 的回答后:也许混淆来自整数除法计算整数? 5 / 2
在 C 中计算为 2
,而不是 2.5
。
任何有小数点的东西都将被处理为浮点数或更大。获取值的方法是 lib 函数 int floor(float) 或 (for roundingup) int ceil(float)。
【参考方案1】:
my_var = (int)my_var;
就这么简单。 如果变量是 int,基本上就不需要了。
【讨论】:
非常感谢!有效!对不起,如果问题太简单了,我是 c 的新手...... 确保为负数和大数执行您想要/应该执行的操作。事情可能更复杂。如果浮点数是正数并且小于您平台上的最大整数,那么您是安全的。 这很好,但它也是未定义的行为。【参考方案2】:在 C 中使用
int C = var_in_float;
他们将转换为隐式
【讨论】:
【参考方案3】:如果你想把它四舍五入到更低,只需投射它。
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
请注意,理想情况下,您应该在转换之前验证 float 是否介于 INT_MIN 和 INT_MAX 之间。
【讨论】:
将宏与逻辑结合使用并不是非常聪明,因为人们倾向于将它们视为函数。例如,如果你要FLOAT_TO_INT(rand())
,它的行为会很奇怪,最好让它成为一个函数
关于:#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))
“将其舍入到更低”对于负值是不正确/不清楚的。 (int)
截断分数。
@user3629249 (x)+0.5f
在总和不精确时会给出不正确的舍入结果。 (x)+0.5
通过使用更广泛的 double
数学来避免这种情况。 IAC lroundf()
,roundf()
更好。【参考方案4】:
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?
【讨论】:
不幸的是,问题在于将float
转换为int
,而不是double
转换为int
@user3629249 同样的问题也适用于float
,但这里只有float
的例子会更好。【参考方案5】:
好客! ——我还没有为我的案子找到满意的答案, 我在这里提供的答案对我有用,但可能不是未来的证明......
如果使用 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() 。 (请参阅 cmets 更多为什么下面使用的 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
在我尝试过的一种特殊情况下。
【讨论】:
pow 返回一个 double,这就是为什么你不能使用%d
打印它。并且为此目的使用 pow 是错误的,因为它可能会返回不正确的整数结果。使用 1e4 来获得 10^4。见Why does gcc compiler output pow(10,2) as 99 not 100?、Why pow(10,5) = 9,999 in C++、Why does pow(5,2) become 24?
哦,这个 (int)14e 很棒。安全吗? 1e4 w/o cast 的类型为“double”(如 pow() 情况)
丢失更改以编辑以上评论更多 - 就在最近我有1e6
的用例,但(像往常一样)我使用printf("%d\n", 1e6);
对其进行测试并得到奇怪的结果。如果发现const int million = 1e6
是安全的,我就开始使用这种格式。
1e6
依赖编译器进行质量 double
到 int
的转换。与pow()
相比,问题的可能性较小,但我认为没有 C 规范可以保证最佳答案。 (int)1e6
的替代品:Why write 1,000,000,000 as 1000*1000*1000 in C? 和 why not safe
是的 pow()
很糟糕,与此示例中的 10e4
相比(必须修复,通过编辑提交)。我想知道为什么10e4
是double
而不是int
,然后尝试1.12e1
和12e-3
来理解。以上是关于C将浮点数转换为int的主要内容,如果未能解决你的问题,请参考以下文章