在C中将float转换为(int) - 声明cast(int)似乎没有任何效果

时间:2017-04-28 19:12:16

标签: c int math.h

C程序将浮点值作为命令行参数,因此需要从string格式化为float然后再格式化为整数。使用math.h中的round(),然后想要转换为int。

通过在值之前声明(int)进行强制转换,但值类型不会更改。

以下代码:

double *f = (double *) malloc(sizeof(double));
*f = (int)roundf(atof(argv[1]));
printf("Testing f: %d", *f);

make会显示以下错误消息:

format specifies type 'int' but the argument has type 'double'
      [-Werror,-Wformat]
    printf("Testing f: %d", *f);

3 个答案:

答案 0 :(得分:3)

您将int放入doublef变量的类型应为int

int f;
f = (int)roundf(atof(argv[1]));

答案 1 :(得分:1)

C有一种直接的方法可以将转换为float转换为整数类型

long int lround(double x);
  

lroundllround函数将它们的参数四舍五入到最接近的整数值,无论当前的舍入方向如何,都将中间情况四舍五入。 ...... C11 7.12.9.7 2

#include <math.h>
#include <stdlib.h>

long i = lround(atof(argv[1]));
// or 
float f = atof(argv[1]);
long i = lroundf(f);

// Use %.0f to print a FP with no factional digits.
printf("%.0f\n", f);

// Use %ld to print a `long`
printf("%ld\n", i);

答案 2 :(得分:1)

错误位于 printf 函数的%d 格式说明符中:

printf("Testing f: %d", *f); /* %d expects an integer but *f is a double */

* f 包含一个四舍五入的数字并不重要,就 printf 而言,它仍然是一个双倍。

试试这个:

printf("testing f: %d", (int)*f);

N.B。为什么你要使用malloc来分配一个double呢?如果你只需要将一个双精度传递给其他程序,你就可以:

double f;
... stuff ...
foo(&f);