将Float转换为整数时解释输出?

时间:2014-02-01 21:27:42

标签: c gcc type-conversion

我完全不知道输出的原因

    float f=1.4, t;
    int d,s;

    d=(int)f;
    printf("d=%d\n",d);
    t=f-d;
    printf("t=%f\n",t);
    t=t*10;
    printf("t=%f\n",t);
    s=(int)t;
    printf("s=%d\n",s);

输出

d=1
t=0.400000
t=4.000000
s=3

以及 f=1.1

时的情况

输出

d=1
t=0.100000
t=1.000000
s=1

这与整数和浮点数存储在内存中的方式有​​关吗?

3 个答案:

答案 0 :(得分:4)

您已初始化f = 1.4,而不是

    d=(int)f;

您正在将float转换为整数,并且当float转换为整数时,句点“。”之后的所有数字。被截断。现在d有1个

    t=f-d;

将是1.4 - 1 = 0.4

    t=t*10;

t = 0.4 * 10 = 4且t为浮点数,因此输出4.0000

Float在结尾处表示尾随零

    s=(int)t;

这里你再次将float转换为整数,现在这里是棘手的部分,上面的所有值都四舍五入,这里t的值为3.99999976所以当转换为整数时它显示3作为结果

这都是因为当你初始化t = 1.4时,实际上它被初始化为1.39999998

答案 1 :(得分:1)

在第一次转让期间

float f=1.4;

有一个近似值,因为1.4意图是双重(不是浮动)。类似1.39999999的内容已分配给f。

尝试使用

float f=1.4f;

它应该按预期工作。

答案 2 :(得分:1)

让我们一步一步地看看浮点和int如何互动。

假设一个典型的平台 floatIEEE 754 single-precision binary floating-point format
doubleIEEE 754 double-precision binary floating-point format

float f=1.4, t;
// 1.4 isn't exactly representable in FP & takes on the closest `double` value of
// 1.399999999999999911182158029987476766109466552734375
// which when assigned to a float becomes 
// 1.39999997615814208984375

int d,s;
d=(int)f;
// d gets the truncated value of 1 and prints 1, no surprise.
printf("d=%d\n",d);

t=f-d;
// t gets the value 0.39999997615814208984375
// A (double) version of t, with the same value is passed to printf()
// This is printed out, rounded to 6 (default) decimal places after the '.' as 
// 0.400000
printf("t=%f\n",t);

t=t*10;
// t is multiplied by exactly 10 and gets the value
// 3.9999997615814208984375
// A (double) version of t, with the same value is passed to printf()
// which prints out, rounded to 6 decimal places after the '.' as 
// 4.00000.
printf("t=%f\n",t);

s=(int)t;
// s gets the truncated value of 3.9999997615814208984375
// which is 3 and prints out 3. - A bit of a surprise.
printf("s=%d\n",s);