我正在尝试将一个int添加到一个浮点数。我的代码是:
int main() {
char paus[2];
int millit = 5085840;
float dmillit = .000005;
float dbuffer;
printf("(float)milit + dmillit: %f\n",(float)millit + dmillit);
dbuffer = (float)millit + dmillit;
printf("dbuffer: %f\n",dbuffer);
fgets(paus,2,stdin);
return 0;
}
输出如下:
(float)millit + dmillit:5085840.000005
dbuffer:5085840.000000
为什么会有区别?我也注意到如果我改变dmillit = .5,那么两个输出都是相同的(5085840.5),这就是我所期望的。为什么是这样?谢谢!
答案 0 :(得分:7)
(float)millit + dmillit 评估为 double 值。当您打印该值时,它会正确显示,但是当您将其存储在 float 变量中时,精度会丢失。
答案 1 :(得分:4)
您尝试使用的精度对浮动来说太大了。在printf函数中,它被铸造成一个双待打印。
请参阅页面IEEE 754 float calculator以更好地理解这一点。
答案 2 :(得分:1)
我相信printf语句中的浮点加法可能会静默地将结果转换为double
,因此它具有更高的精度。
答案 3 :(得分:1)
printf("(float)milit + dmillit: %f\n",(float)millit + dmillit);
我相信在这里,添加是以double形式完成的,并作为double传递给printf。
dbuffer = (float)millit + dmillit;
printf("dbuffer: %f\n",dbuffer);
这里的添加是以double形式完成的,然后缩小为浮点数以存储在dbuffer中,然后扩展回double以传递给printf。