浮点数精度问题
总述
浮点数精度的原因其实还是比较容易理解的,就是一些十进制小数部分在转化为二进制时位数表示不尽或位数太长,超出了浮点数的精度,就会自动舍弃一部分,导致保存的值和原来的值不符。
这个精度问题会导致两种情况
- 本来相同的值变得不同
这个好理解,0.2+0.1在浮点数表示下不等于0.3,这种情况下在最后的低位有极小的差别,我们只要根据题目的数据范围判断一个大致的精度,然后默认只要这个精度内相同,就认为这两个浮点数相同即可。
- 本来不同的值变得相同
这个就稍微棘手一点了,首先原因是什么呢,举个例子(有些有题目数据范围就是1e9):
1/1000000000=0.000000001;
1/999999999=0.00000000100000001(约等于,我用计算器算的)
也就是说,这两个数在小数点后第18位才有差距,但是double类型的精度只能表示小数点后15~16位,然而在double范围内,这两个数是相等的,所以遇到这种情况几乎无解,你只有一种方法,就是使用long double 能表示的精度17~18位,这样才能显示出这两个数的差异
当然了,有一点需要注意的是,这两种情况的解决办法不能同时使用,因为一个是取一个小范围数据可信,另一个是取尽量长的范围可信。互相冲突。
所以,最保险的方法就是通分,尽量将小数比较转化为整数比较。一但你遇到了浮点数运算,且进行浮点数的大小比较,一定要考虑精度问题,反之,如果只有浮点数,没有运算,就不需要管精度了,随便比较,当然,没有比较环节的话也不需要管精度的
补充(用通分的方法比较两个分数)
可以用pair类型的数存储一个分数,first存分子,second存分母,然后写一个比较函数进行比较就行了。
哥们写挺好的呀