1. 有效位数与精度
有效位和精度的两个概念是不同的,我们先说float和double各自的有效位。
在float与double中默认的有效位都是6位有效位,意思就是从第一个不为0的数字算起有6个数字是有效的 后边无效的数字也不会显示,如下图:
代码:
运行结果:
可以看出不管你的float定义的有多少位小数 默认情况下只会输出6位有效位。
可以通过一下语句来修改默认的有效位数:
cout.precision(k);//k为k为有效位
setprecision(k);//上述两个语句等价
例如:
代码:
运行结果:
注意:如果我将这个有效位设置的比较大,那会都给我显示出来嘛?
回答:显然不可能,这里有个前提条件 就是你的有效位与该数据类型的精度之间的关系要正确。
具体来说:当你的有效位设置的位数小于精度时 那么就会显示那么多有效位 但是当你的有效位设置大于精度时,虽然会显示那么多位,但是多余精度的位数是不准确的,此时已经溢出。
如下:
代码:
此时,我的有效位设置的与float的精度一样大 结果如下且正确:
另一种设置,将有效位设置的很大!
代码:
运行结果:
double类型也是如法炮制:
只要搞清楚有效位与精度之间的概念和关系即可!
这里强调一下:
有效位:float和double类型的有效位默认都是6位
精度:
float精度是7位
double的精度是15位
2.控制小数位数:
cout.setf(ios::fixed);
cout.precision(3);
上述代码,表示我设置输出小数位数为3位 注意不是有效位数哦。
代码:
运行结果:
注意:上述语句使用也是需要在精度规定的范围内,才有效。
当你设置的小数位数的精度没有超过该数据类型的精度 但是当前的这个数值没有那么多小数位 此时使用0来代替。
代码:
运行结果:
3.两者上限不同
float: 3e38
double: 1.7e308
4.推荐使用
鉴于 float 精度不够,对于有小数的情况建议使用 double。但考虑到性能, long double 性价比就不高了。使用 float 出现瓶颈的概率会比 double 大些,特别是计算阶乘这种情况下。