问题遇到的现象和发生背景
double类型小数点精度
问题相关代码,请勿粘贴截图
[root@localhost tmp]# cat aa.c
#include <stdio.h>
#include <stdlib.h>
void main()
{
/case 1/
printf("111 %.15f\n", 1.234567890123456 + 1e-15);
double d1;
/*case 2*/
d1 = 1.234567890123456;
d1 = d1 + 1e-15;
printf("222 %.15g\n", d1);
/*case 3*/
d1 = 1.234567890123456;
d1 = d1 + 1e-15;
printf("222 %.16g\n", d1);
}
运行结果及报错内容
[root@localhost tmp]# ./a.out
111 1.234567890123457
222 1.23456789012346
222 1.234567890123457
我的解答思路和尝试过的方法
case1和case2看起来是一样的操作,为什么同样用%.15g显示,case2丢了一位呢,正确结果是1.234567890123457,结果四舍五入为1.23456789012346了。而在case 3中改为%.16多一位显示,结果就正确了
我想要达到的结果
为什么要用%.16才正确显示15位的计算结果,是因为补码?