6.10随笔(关于C语言float和double类型的精度问题)
1 | int main() |
1 | Output: |
众所周知,double
和float
都是浮点数,他们的输入输出格式分别对应%lf
和%f
由于计算机内部都是用$0$和$1$存储数据,所以存储整数的时候不会存在精度问题,但是存储小数就会有问题了,因为$2^{-1}=0.5$、$2^{-2}=0.25 … …$,如果我们要存储的数为$0.7$,我们是无法准确的对其进行存储的。
另外,double
的精度比float
高,再加上输出会默认四舍五入,结合上面的输出,我们可以猜想:2.005以double
的形式存储的时候真实值小于2.005,以float
的形式存的时候,其真实值略大
实际上,用代码也可以很直观的看出来:
1 | int main() |
1 | Output: |
考虑到精度问题,接下来是围绕精度问题的一个问题:四舍五入
在以%f
或者%lf
输出的时候,程序会默认四舍五入,但是遇到了像上面的情况怎么办呢?
很简单,在后面加上一个略小的数即可,但是这个数也不是随便加的。我觉得,如果要保留n位小数,那么加上0.000…001(小数点后面n+2/3/4个0的位置
)比较合适。这个值绝对不能太大,不然本来不进位的进位了,也不能十分小,不然没效果。
另外一种是模拟进位,使用int
强转,舍弃小数部分的原理
两种方法:
1 | int main() |
1 | Output: |