V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lisonfan
V2EX  ›  问与答

刚学 C 遇到一个问题,double 的...

  •  
  •   lisonfan · 2014-09-23 17:41:14 +08:00 · 2586 次点击
    这是一个创建于 3716 天前的主题,其中的信息可能已经有所发展或是发生改变。
    double r,h;
    double pai;
    double tj;
    pai=3.14;
    printf("请输入半径:");
    scanf("%g",&r);
    printf("请输入高:");
    scanf("%g",&h);
    tj=pai*r*r*h;
    printf("体积:%g",tj);
    这代码没错吧。。。
    怎么最后输出结果是0..
    12 条回复    2014-09-24 07:21:13 +08:00
    ggarlic
        1
    ggarlic  
       2014-09-23 17:53:53 +08:00   ❤️ 1
    把你scanf里的%g换成%lf

    原因:
    printf其实会类型提升
    scanf不会
    所以你在printf下写%f %g都一样,float会转为double
    但是在scanf下,%g就是float,%lf才是double
    Plumes
        2
    Plumes  
       2014-09-23 17:54:54 +08:00   ❤️ 1
    scanf里面改成 %lg
    %g 对应的是 float
    lisonfan
        3
    lisonfan  
    OP
       2014-09-23 18:04:45 +08:00
    @Plumes 你好,我还有一个疑问就是最后输出的结果只取小数点后面3位,第四位就会四舍五入。
    int main(int argc, char *argv[]) {
    double r,h;
    double pai;
    double tj;
    pai=3.1415926535;
    printf("请输入半径:");
    scanf("%lg",&r);
    printf("请输入高:");
    scanf("%lg",&h);
    tj=pai*r*r*h;
    printf("体积:%g",tj);
    return 0;
    }
    lisonfan
        4
    lisonfan  
    OP
       2014-09-23 18:06:18 +08:00
    @Plumes 要怎样才不会四舍五入?应该如何修改?谢谢
    Plumes
        5
    Plumes  
       2014-09-23 18:11:05 +08:00
    @lisonfan
    printf的时候使用 %lf
    lisonfan
        6
    lisonfan  
    OP
       2014-09-23 18:15:45 +08:00
    @Plumes 用%lf也只取小数点后面的6位,然后又四舍五入了.
    ggarlic
        7
    ggarlic  
       2014-09-23 18:23:06 +08:00
    你要小数点后几位?%.7lf 是小数点后7位
    lisonfan
        8
    lisonfan  
    OP
       2014-09-23 18:25:40 +08:00
    @ggarlic 不能结果输出多少位就显示多少位吗?只能要定义吗?
    ggarlic
        9
    ggarlic  
       2014-09-23 18:59:38 +08:00   ❤️ 1
    不能吧,想不到怎么搞

    如果你想看最长的有效位数你可以使用ieee754的阶码的最长位数来显示
    #include <float.h>
    printf("体积:%.*lf", DBL_DIG, tj);
    DBL_DIG就是阶码最长位数

    然后你会看到最后一位数字总也不对,这你就得学习下计算机里数字怎么存储的了

    Python里:
    In [1]: 0.1+0.1+0.1-0.2
    Out[1]: 0.10000000000000003
    LbyG
        10
    LbyG  
       2014-09-23 20:12:50 +08:00
    #include <iostream>
    using namespace std;

    int main()
    {
    double a=1.567;
    a=int(a*100)/100.0;
    printf("%.2lf",a);
    return 0;
    }
    这样就可以输出1.56了,不知道楼主是不是这个意思
    ggarlic
        11
    ggarlic  
       2014-09-23 22:27:43 +08:00
    @LbyG 楼主的意思是自适应位数,结果是两位就显示两位,结果是5位就显示5位。不是这种每次都手动指定位数的做法
    msg7086
        12
    msg7086  
       2014-09-24 07:21:13 +08:00 via iPhone
    @lisonfan 计算机的浮点数的位数是2进制的概念,在10进制里讨论没意义。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3592 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:14 · PVG 19:14 · LAX 03:14 · JFK 06:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.