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.5double 你真的想要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 依赖编译器进行质量 doubleint 的转换。与pow() 相比,问题的可能性较小,但我认为没有 C 规范可以保证最佳答案。 (int)1e6 的替代品:Why write 1,000,000,000 as 1000*1000*1000 in C? 和 why not safe 是的 pow() 很糟糕,与此示例中的 10e4 相比(必须修复,通过编辑提交)。我想知道为什么10e4double 而不是int,然后尝试1.12e112e-3 来理解。

以上是关于C将浮点数转换为int的主要内容,如果未能解决你的问题,请参考以下文章

C# - 将浮点数转换为整数...并根据余数更改整数

将浮点数转换为字符串[重复]

将浮点数转换为字符串

如何使用 C 中的常量格式化将浮点数转换为指数

如何把浮点数转换成字符串?

Javascript将浮点数转换为指数[重复]