| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3794 人关注过本帖
标题:朋友们,我想请教下C语言中1.0/3*3用%f输出结果居然是1.000000,不该是0.99 ...
只看楼主 加入收藏
primer1234
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-9-27
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
朋友们,我想请教下C语言中1.0/3*3用%f输出结果居然是1.000000,不该是0.999999吗?
#include<stdio.h>
int main()
{
printf("%f\n",1.0/3*3);//输出结果为1.000000
printf("%f",0.333333*3);//输出结果为0.999999
}

广大朋友们,我想知道这是为什么?
搜索更多相关主题的帖子: C语言 输出 结果 居然 printf 
2017-09-27 11:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
首先 1.0/3*3 就等于 1.0
好吧,即使不是1.0,而是 0.9999999999999987654321,那约到小数点后6位输出 难道不应该是1.000000 ?!
你也说说你的理由嘛
2017-09-27 12:16
primer1234
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-9-27
收藏
得分:0 
回复 2楼 rjsp
假如我用%lf输出也还是1.0耶,我就搞不懂了呀!
2017-09-27 18:16
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
从浮点数在内存的存储看
如:
图片附件: 游客没有浏览图片的权限,请 登录注册

#include <stdio.h>

void fm(float a)
{
    unsigned int *b = (unsigned int *)&a;
    printf("%d ", (*b>>31)&1);
    int i;
    for (i=30; i>22; --i)
        printf("%d", (*b>>i)&1);
    printf(" ");
    for (i=22; i>=0; --i)
        printf("%d", (*b>>i)&1);
    printf("\n");
}

float mf(char *p)
{
    float a=1.0, b=0.0;
    for (++p; *p; ++p)
    {
        a /= 2;
        if (*p=='1')
            b += a;
    }
    return b;
}

main()
{
    fm(1.0/3*3);
    fm(0.333333*3);
    printf("0.111111111111111111101111 = %f\n", mf(".111111111111111111101111")); //二进制小数转10进制
}

浮点数在内存的存储,包括符号位、阶码E、尾数M。
浮点表示的一般形式为:R=M*2^e  (e=E-127)
32位编译的float类型:
符号1位;阶码(E)8位, e=E-127;尾数23位,实际精度为24位(最高位恒为1,不必存储)。

图片附件: 游客没有浏览图片的权限,请 登录注册



[此贴子已经被作者于2017-9-28 00:53编辑过]

2017-09-28 00:50
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
再看看:
fm(1.0/3);
fm(0.333333);
图片附件: 游客没有浏览图片的权限,请 登录注册

可见 1.0/3 > 0.333333
2017-09-28 08:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用primer1234在2017-9-27 18:16:50的发言:

假如我用%lf输出也还是1.0耶,我就搞不懂了呀!

那你也说说理由嘛,为什么就不是1.0?
2017-09-28 08:58
primer1234
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-9-27
收藏
得分:0 
回复 6楼 rjsp
原来是这样,我看懂了 !
感谢你们!
2017-09-28 11:45
primer1234
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-9-27
收藏
得分:0 
回复 5楼 吹水佬
大哥,我刚读大一,你写成这样;我真心读不懂程序!不过有人说要是%f没有说明的话就会保留6位小数,超出的第一位会进行四舍五入?
例如:printf("%f",1.1234567);输出的结果是1.123457
好像是正确的,你觉得呢?
2017-09-28 11:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用primer1234在2017-9-28 11:52:28的发言:

超出的第一位会进行四舍五入?

记不清了,好像只有VC才是这样。其它所有编译器都是按“四舍六入无成双”的规则办事
程序代码:
#include <stdio.h>

int main( void )
{
    printf( "%f\n", 0.0078125 );
}
gcc 输出的是 0.007812
2017-09-28 13:01
快速回复:朋友们,我想请教下C语言中1.0/3*3用%f输出结果居然是1.000000,不该是 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020593 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved