[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
*/