将浮点数类型转换为int时的未知行为。

时间:2015-05-24 01:34:18

标签: c floating-point typecast-operator

我想使用以下代码对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但是我仍然想知道为什么会发生这种情况。

1 个答案:

答案 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