标题:朋友们,我想请教下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
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册: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
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册: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
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册: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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-480986-1-1.html




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

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