C格式字符串printf("%lld")错误的结果

时间:2015-07-06 14:32:58

标签: c printf c-strings

long long temp_number;
float input = 0.7f;
temp_number = input*100;
printf("%lld",temp_number);

有人可以解释为什么我会得到69而不是70?

1 个答案:

答案 0 :(得分:1)

这里没有什么神秘的。它类似于将1/3写为小数0.333333~~含义"重复")然后乘以3。答案是0.999999~而非1,我希望您能看到这与计算机科学无关。

您已将float转换为long long int,编译器警告说这样做可能会导致数据丢失。但是,在转换为其他类型之前,请乘以100,所以让我们再看一下float示例。

十进制值0.7无法以二进制float格式精确表示。当printffloat一起使用时,它会对尾数的最低位进行舍入以处理问题。所以当我这样做时

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表示截断了重复的分数。也许有一种数字类型可以保存这些信息并相应地计算算术函数。