我完全不知道输出的原因
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
这与整数和浮点数存储在内存中的方式有关吗?
答案 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
如何互动。
假设一个典型的平台
float
是IEEE 754 single-precision binary floating-point format和
double
是IEEE 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);