我可以在C中正确地将0.16,0.32等转换为整数(16,32等)吗?

时间:2013-02-20 00:48:40

标签: c casting int double

我试图转换双247.32的小数部分 到一个int 32。我只需要两位小数。

我可以将double转换为int并从double中减去以获得.32000

然后我可以乘以100得到32.000

但是当我尝试将32.000转换为int时,它会变成31

我能解决这个问题吗? 我应该使用与double不同的数据类型来存储该数字吗?

由于

3 个答案:

答案 0 :(得分:4)

问题(skjaidev的答案没有解决)是247.32无法在二进制浮点中精确表示。实际存储的值可能是:

247.31999999999999317878973670303821563720703125

所以你不能只丢弃整数部分,乘以100,然后转换为int,因为转换会截断

round()中声明的<math.h>函数将double值舍入到最接近的整数 - 但结果仍为double类型。

double a = 247.32;
a -= trunc(a);      /* a == 0.32 -- approximately */
a *= 100.0;         /* a == 32.0 -- approximately */
a = round(a);       /* a == 32.0 -- exactly */
printf ("%d\n", (int)a);

或者,将计算放在一行:

double a = 247.32;
printf("%d\n", (int)round(100.0 * (a - trunc(a))));

实际上,这可能是一种更简洁的方法:

double a = 247.32;
printf("%d\n", (int)round(100.0 * fmod(a, 1.0)));

答案 1 :(得分:2)

给定输入值x并输出y

char buf[5];
snprintf(buf, sizeof buf, "%.2f", fmod(x, 1.0));
y = strtol(buf+2, 0, 10);

或仅y = 10*(buf[2]-'0')+buf[3]-'0';以避免strtol费用。

这是关于唯一的方式,无需自己编写一吨代码即可完成您想要的工作,因为printf系列函数是唯一的标准能够执行十进制舍入的函数。

如果您有一些额外的约束,例如x非常接近1/100的倍数,您可能会作弊并做一些类似的事情:

int y = ((x+0.001)*100;

顺便说一句,如果你的问题涉及金钱,不要使用浮点钱!使用以美分为单位的整数或您的货币的最小单位。

答案 2 :(得分:0)

由于你只需要2个小数位,这对我有用:

double a = 247.32;
int b = (int) (a * 100)%100;
printf ("%d\n", b);

更新:请参阅下面的评论。