long long temp_number;
float input = 0.7f;
temp_number = input*100;
printf("%lld",temp_number);
有人可以解释为什么我会得到69而不是70?
答案 0 :(得分:1)
这里没有什么神秘的。它类似于将1/3
写为小数0.333333~
(~
含义"重复")然后乘以3
。答案是0.999999~
而非1
,我希望您能看到这与计算机科学无关。
您已将float
转换为long long int
,编译器警告说这样做可能会导致数据丢失。但是,在转换为其他类型之前,请乘以100,所以让我们再看一下float
示例。
十进制值0.7
无法以二进制float
格式精确表示。当printf
与float
一起使用时,它会对尾数的最低位进行舍入以处理问题。所以当我这样做时
float f = 0.7f;
printf("%f\n", f);
我想要的输出是0.700000
。但是当我将float
值乘以100时,会在尾数的最低有效位中产生更大的误差,之前只有1
出错。所以现在使用
float f = 0.7f;
printf("%f\n", f*100);
输出为69.999999
,因为将最低有效位向上舍入不会使数字汇总到70.000000
。
返回1/3
的十进制表示的第一个示例,但是在有限的存储大小中,将10位十进制数字称为0.333333333
。乘以3
给出9.999999999
并向上舍入最后一位数将产生1.000000000
。但乘以30
会得{4},并且最后一位数的四舍五入不会产生9.999999990
。
C语言没有"知道"数字的10.00000000
表示截断了重复的分数。也许有一种数字类型可以保存这些信息并相应地计算算术函数。