c语言double类型不能用%d输出,会出错

#include <stdio.h>
#include<math.h>
int main()
{double PI,last,sum;
double i=2,j=1;
int k=1;
sum=1;
do{last=i/j;
sum=sum*last;
if(k%2==0)
i=i+2;
else
j=j+2;
k++;
}while(fabs(2*sum-3.1415)>0.00001);
PI=2.0*sum;
printf("%.4lf\n%d\n%lf\n%d\n%lf\n%lf",PI,k-1,j,j,i,i);
return 0;

最后一行printf 有疑问,大神可以改i、j的个数或者乱七八糟的,试试看,我只想知道为什么。
千万别跟我说什么double应该用%lf等等的废话

printf:限定符:
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
%p 输出地址符

可以在"%"和字母之间加小写字母l, 表示输出的是长型数。
例如: %ld 表示输出long整数
%lf 表示输出double浮点数

你用%d去输出Double型的j,输出当然不对啊追问

最后两个%lf输出i的值不一样,为什么

追答

printf除了第一个参数,后面的是void*型的,可以为任何类型数据。

但是在执行printf函数时,先把所有参数按从右向左的顺序压入堆栈,参数进入堆栈后就是连续储存了,然后再按照printf第一个参数的格式来处理数据,由于数据连续,所以只要前面一个数据没有对齐,后面的都会出错。
用“%d”来输出double型的数据,相当于丢弃了四个字节,这被丢弃的四个字节就被归到后面的数据去了,有可能就会导致后面的数据出错。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-21
输出格式 定义了 计算机 内存单元里的信息 怎样 转 换 为 人类可识别 的 数值 和 字符形状 输出出来。
计算机 内存单元里的信息 安排方式 由 IEEE 国际 标准 规定 --
double 有几个字节,分成多少字元,哪位是符号位,哪几位是 指数,哪几位 是 尾数。
int 有几个字节,分成多少字元,哪位是符号位,哪几位 是数值,是原码,还是 补码。
输出时,把 内存单元里的信息 要 翻译成 人类可识别 的形式。
输出格式 %d 定义了 按 int 型 符号位,数值位,判断是原码,还是 补码 翻译。
输出格式 %lf 定义了 按 double 型 符号位,指数,尾数 翻译。
所以,输出格式 定义了 内存单元里的信息 如何翻译。
double 型 内存信息 按 int 型 符号位,数值位,判断是原码,还是 补码 翻译,当然错了。
IEEE 754 标准 可以网上查到,阅读起来要费些时间,读懂会用,要几天工夫。追问

好厉害啊,但是我的关键是为什么最后两个%lf输出i的值不一样,我电脑上一个是15303.000000,一个是15304.000000

追答

因为前面格式错了,后面就乱了。改成: ....j, (int) j,i,i); 就好了。-- 用1个 (int) j 对应 %d 格式。

printf("%.4lf\n%d\n%lf\n%d\n%lf\n%lf",PI,k-1,j, (int) j,i,i);

第2个回答  2013-11-20
额,double型的存储形式和int的不一样追问

最后两个%lf输出i的值不一样

相似回答