A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[C] 纯文本查看 复制代码
double doubleArray[] =
    {
        //整数部分6个,小数部分12个//
        999999.099999999999,    //输出999999.100000

        //第7位小数==0~~9//
        999999.999999099999,    //输出999999.999999
        999999.999999199999,    //输出999999.999999
        999999.999999299999,    //输出999999.999999
        999999.999999399999,    //输出999999.999999
        999999.999999499999,    //输出999999.999999
        999999.999999599999,    //输出1000000.000000
        999999.999999699999,    //输出1000000.000000
        999999.999999799999,    //输出1000000.000000
        999999.999999899999,    //输出1000000.000000
        999999.999999999999,    //输出1000000.000000
        
        //整数部分6位,小数部分第7位开始都是9
        999999.099900999999,    //输出999999.099901
        
        //整数部分10位,小数部分超过7位//
        9999999999.09999999,    //输出9999999999.100000
        9999999999.09990099999, //输出9999999999.099901

        //整数部分15个,小数部分1个
        999999999999999.0,  //输出999999999999999.000000
        999999999999999.1,  //输出999999999999999.125000
        999999999999999.2,  //输出999999999999999.250000
        999999999999999.3,  //输出999999999999999.250000
        999999999999999.4,  //输出999999999999999.375000
        999999999999999.5,  //输出999999999999999.500000
        999999999999999.6,  //输出999999999999999.625000
        999999999999999.7,  //输出999999999999999.750000
        999999999999999.8,  //输出999999999999999.750000
        999999999999999.9,  //输出999999999999999.875000

        
        //整数部分15个,小数部分分别为:00 04 09
        999999999999999.00, //输出999999999999999.000000
        999999999999999.04, //输出999999999999999.000000
        999999999999999.09, //输出999999999999999.125000
        
        //整数部分为16~~20个
        9999999999999999.0,         //输出10000000000000000.000000
        
        10000000000000000.0,        //输出100000000000000000.000000
        20000000000000000.0,        //输出100000000000000000.000000
        30000000000000000.0,        //输出100000000000000000.000000
        40000000000000000.0,        //输出100000000000000000.000000
        50000000000000000.0,        //输出100000000000000000.000000
        60000000000000000.0,        //输出100000000000000000.000000
        70000000000000000.0,        //输出100000000000000000.000000
        80000000000000000.0,        //输出100000000000000000.000000
        90000000000000000.0,        //输出100000000000000000.000000
        
        99999999999999999.0,        //输出100000000000000000.000000
        99999999999999999.1,        //输出100000000000000000.000000
        99999999999999999.2,        //输出100000000000000000.000000
        99999999999999999.3,        //输出100000000000000000.000000
        99999999999999999.4,        //输出100000000000000000.000000
        99999999999999999.5,        //输出100000000000000000.000000
        99999999999999999.6,        //输出100000000000000000.000000
        99999999999999999.7,        //输出100000000000000000.000000
        99999999999999999.8,        //输出100000000000000000.000000
        99999999999999999.9,        //输出100000000000000000.000000
        999999999999999999.0,       //输出1000000000000000000.000000
        9999999999999999999.0,      //输出10000000000000000000.000000
        99999999999999999999.0      //输出100000000000000000000.000000
    };
    

    /*
      声明:由于double类型只能存16位, 且小数部分最多只能存6位, 所以这里只考虑:
      整数部分 + 小数部分 ≈ 16位的情况 || 小数部分稍微大于6的小数)
     */
    
    //综上:
    
    /*
     由    整数部分6个,小数部分12(11个9)个
        && 整数部分6位,小数部分第7位开始都是9
        && 整数部分6位, 第7位小数==0~~9 
        && 整数部分10位,小数部分超过7位  
     
     的输出结果
     
     整数部分6个,小数部分12(11个9)个
     999999.099999999999,    //输出999999.100000
     
     整数部分6位,小数部分第7位开始都是9
     999999.099900999999,    //输出999999.099901
     
     整数部分6位, 第7位小数==0~~9
     999999.999999099999,    //输出999999.999999
     999999.999999199999,    //输出999999.999999
     999999.999999299999,    //输出999999.999999
     999999.999999399999,    //输出999999.999999
     999999.999999499999,    //输出999999.999999
     999999.999999599999,    //输出1000000.000000
     999999.999999699999,    //输出1000000.000000
     999999.999999799999,    //输出1000000.000000
     999999.999999899999,    //输出1000000.000000
     999999.999999999999,    //输出1000000.000000

     整数部分10位,小数部分超过7位
     9999999999.09999999,    //输出9999999999.100000
     9999999999.09990099999, //输出9999999999.099901
     
     可知:
     1. 整数位数小于10位, 且有效位数超过16位, 则第17位四舍五入,输出形式为:x(整数有多少位就输出多少位)x.x(小数只输出6位)x;
     
     2. 整数位数>10 && <16, 且有效位数超过16位, 则第17位四舍五入,输出形式为:x(整数有多少位就输出多少位)x.x(小数输出16-整数位)x;
     
     3. 这里的四舍五入跟数学中的四舍五入一样,例如:9.999保留一位小数为: 10.0
     
     由:
     整数部分为16~~20个的输出结果(由于doubel_MAX太大了,这里只测试到20位,有兴趣的同学可以自己玩...)
     9999999999999999.0,         //输出10000000000000000.000000
     
     10000000000000000.0,        //输出100000000000000000.000000
     20000000000000000.0,        //输出100000000000000000.000000
     30000000000000000.0,        //输出100000000000000000.000000
     40000000000000000.0,        //输出100000000000000000.000000
     50000000000000000.0,        //输出100000000000000000.000000
     60000000000000000.0,        //输出100000000000000000.000000
     70000000000000000.0,        //输出100000000000000000.000000
     80000000000000000.0,        //输出100000000000000000.000000
     90000000000000000.0,        //输出100000000000000000.000000
     
     99999999999999999.0,        //输出100000000000000000.000000
     99999999999999999.1,        //输出100000000000000000.000000
     99999999999999999.2,        //输出100000000000000000.000000
     99999999999999999.3,        //输出100000000000000000.000000
     99999999999999999.4,        //输出100000000000000000.000000
     99999999999999999.5,        //输出100000000000000000.000000
     99999999999999999.6,        //输出100000000000000000.000000
     99999999999999999.7,        //输出100000000000000000.000000
     99999999999999999.8,        //输出100000000000000000.000000
     99999999999999999.9,        //输出100000000000000000.000000
     999999999999999999.0,       //输出1000000000000000000.000000
     9999999999999999999.0,      //输出10000000000000000000.000000
     99999999999999999999.0      //输出100000000000000000000.000000
     
     我猜想:
     超出16位之后的数,自动忽略,然后整数位数 + 1,输出格式为: 1x(整数位数-1个0)x.000000
     
     
     
     float测试方式差不多, 所以我猜想, 视频中说的:
     
     如果坑的类型是float类型 那么这个坑中可以存储有效位数不超过7位的小数.
     有效位数: 去掉小数点.的位数. 12.123   45.125678
     如果你往其中存储的小数的有效位数超过了7位,那么超出的部分无法精确存储.只能精确存储前面的7位.
     
     如果坑的类型是doube类型.那么这个坑中可以存储有效位数不超过16位的小数.
     如果你往其中存储的小数的有效位数超过了16位,那么超出的部分无法精确存储.只能精确存储前面的16位.
     
     可能不是很准确
     
     */
    
    int doubleArrayLenght = sizeof(doubleArray) / sizeof(doubleArray[0]);
    
    for(int i = 0; i < doubleArrayLenght; i++)
    {
        printf("%lf\n",doubleArray[i]);
    }
    
    printf("%lf\n",DBL_MAX);
    /*doubel类型最大值:
     179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
     
     */
    

http://bbs.itheima.com/forum.php?mod=attachment&aid=MTI4ODcxfDMxMmFlODYxYzg2YTk1NzBhNzk2Mzc5MzEyMWViMDFjfDE3MzIzMDU3NTg%3D&request=yes&_f=.zip

4 个回复

正序浏览
现实是很残酷的,所以,.......
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
看着码得这么辛苦的份上, 赏几个黑马币或者是几个技术分呗~~{:3_65:}
回复 使用道具 举报
码得好辛苦...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马