我想使用以下代码对float进行类型转换。 change是一个float,changeI是一个int。棘手的输入值是0.41,因为它无法准确地用二进制表示,但我不明白为什么这不起作用。
changeI = (int)(change*100)
如果我只打印(更改* 100.0),它会输出41.0000003或等效的东西,根据我的理解,如果我输入,即(int)它应该只丢弃浮点位并将数字保留为41。
但是,如果我打印出changeI的值,我会得到413,而且我不知道为什么。
另外,如果我手动打印(int)41.0000003,它也会打印为413
编辑:
好的,所以我找到了主要的问题,顺便说一下这是非常愚蠢的(我之后打印了额外的3并忘记了之前打印中的新行字符,但现在它打印的是40而不是41)。 这是完整的代码。
int flag = 0;
float change;
int changeI;
do{
printf("How much change is owed?: ");
scanf("%f", &change);
if (change >= 0){
flag = 1;
}
}while(!flag)
changeI = (int)(change*100.0);
printf("%f\n", change*100.0);
printf("%i\n", changeI);
printf("%i\n", (int)(41.0000003));
0.41的输出为:
>41.0000003
>40
>41
Edit2:正如JackV所说,如果你将浮动乘以100再复制到另一个浮点数然后对新浮点数进行类型转换它会打印41但是我仍然想知道为什么会发生这种情况。
答案 0 :(得分:1)
我不确切地知道你在做什么,但是这个:
#include<stdio.h>
int main()
{
int changeI, newI;
float change = 0.41, var = change * 100;
changeI = (int)(change*100);
newI = (int)(var);
printf("%f", var); //prints 41.000000
printf("int = %d\n", changeI); //prints 40
printf("float = %f", change); //prints 0.410000
printf("%d", newI); //prints 41
return 0;
}
完全按照它打印的方式工作:
int = 40
float = 0.410000