C语言中double输出值被改变了,为什么呢?

笑遍整个世界 2014-01-19 02:17:35
小程序如下:
#include <stdio.h>

main()
{
double dValue = 2.0;
printf("%d\t%f",dValue, dValue);
}
结果答案凶残的输出:0 0.000000
为什么呢?
...全文
472 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-03-02
  • 打赏
  • 举报
回复
再说一句,C语言标准,输出函数的 %lf 格式,居然是不在标准中 这个很麻烦 不同编译系统的实现对于输出 float ,double 类型数据,可能就不一致了 有些支持%lf格式的 double 可以用%lf精确输出,用%f 就精度不够了. 不支持的虽然%f格式可以同时输出float,double 但是两种系统不一致,代码就不兼容了. 这是故意的么???????????
陆小路 2014-01-19
  • 打赏
  • 举报
回复
结贴就可以给分了
笑遍整个世界 2014-01-19
  • 打赏
  • 举报
回复
引用 3 楼 lm_whales 的回复:
这个很好解释,尾部和前部拼接到一起,结果自然不乐观了 实际参数类型: char * , double ,double 参数传递时的长度 :[ 4B ] ,[8B ] ,[8 B ] 格式串和对应的格式 :格式串 , %d , %f 输出时看作的长度 :[ 4 B ] ,[ 4B],[8B ],[4B] 最后4B是多余的,无用参数字节。 输出时直接看作的类型:const char * ,int ,double 输出时最终看作的类型:const char *,int ,float 第2,3 两个个参数,被劈为两半 第2参数,前一半,对应 %d 格式 4B,后一半对应%f格式 8B 差了4B,第三个参数的前4B补上。最后4B,用不上,不管他。 PS: 输出时,不论实参是double 还是 float , %f对应 float 数据,所以要转换成 float 输出,会造成精度丢失。 所以double 不应该使用 %f 输出。 同理,%lf 对应double, float类型,没有必要用 %lf输出。 因为,float 表示精度太低; 不需要用%lf,这种高精度方式输出。
谢谢.我知道你说的了.第一次用这CSDN的提问,不知道怎么给你分啊.
mujiok2003 2014-01-19
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
doule类型用%lf,否则结果难料。 [quote=引用 楼主 u013487029 的回复:] 小程序如下: #include <stdio.h> main() { double dValue = 2.0; printf("%d\t%f",dValue, dValue); } 结果答案凶残的输出:0 0.000000 为什么呢?
[/quote] ++
lm_whales 2014-01-19
  • 打赏
  • 举报
回复
printf 函数的输出方式,是依照格式数字节,来进行参数匹配的。 实参传递则是,按照数据类型,参数传递占用的字节数,传递数据(由C调用约定决定)。 Win32: bool,char,int,long ,void * (32Bits 4Bytes) long long (64Bits--8Bytes) float,double(64Bits--8Bytes) PS: 实参传递的字节数,和数据类型的字节数并不相同。 参数传递的时候,会隐性的进行类型转换(类型提升)。
lm_whales 2014-01-19
  • 打赏
  • 举报
回复
这个很好解释,尾部和前部拼接到一起,结果自然不乐观了 实际参数类型: char * , double ,double 参数传递时的长度 :[ 4B ] ,[8B ] ,[8 B ] 格式串和对应的格式 :格式串 , %d , %f 输出时看作的长度 :[ 4 B ] ,[ 4B],[8B ],[4B] 最后4B是多余的,无用参数字节。 输出时直接看作的类型:const char * ,int ,double 输出时最终看作的类型:const char *,int ,float 第2,3 两个个参数,被劈为两半 第2参数,前一半,对应 %d 格式 4B,后一半对应%f格式 8B 差了4B,第三个参数的前4B补上。最后4B,用不上,不管他。 PS: 输出时,不论实参是double 还是 float , %f对应 float 数据,所以要转换成 float 输出,会造成精度丢失。 所以double 不应该使用 %f 输出。 同理,%lf 对应double, float类型,没有必要用 %lf输出。 因为,float 表示精度太低; 不需要用%lf,这种高精度方式输出。
nanjun520 2014-01-19
  • 打赏
  • 举报
回复
刚测试了一下 确实很凶残 http://www.cnblogs.com/yangyh/archive/2011/10/03/2198631.html "%d"打印出0是很好解释的。但是写在一起的时候%f输出也为0我还没弄明白, 不过你如果改成 printf("%f\t%d\n",dValue, dValue);居然%f会输出正确。这个我只是在windosxp 的vs2008下测试的,不清楚与编译器是否有关
图灵狗 2014-01-19
  • 打赏
  • 举报
回复
doule类型用%lf,否则结果难料。
引用 楼主 u013487029 的回复:
小程序如下: #include <stdio.h> main() { double dValue = 2.0; printf("%d\t%f",dValue, dValue); } 结果答案凶残的输出:0 0.000000 为什么呢?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧