浮点数的精度问题

AI-摘要
Tianli GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
浮点数的精度问题
宋书生1. 两个浮点数是否可以直接比较大小?
直接比较的可行性
大小比较(>、<、>=、<=):可以直接使用,因为浮点数的有序性保证了大小关系的正确性。
示例:
3.14 > 2.71
或a < b
的运算结果是可靠的。相等性比较(==)的风险:
精度陷阱:浮点数的二进制存储可能导致微小误差,例如:
1
0.1 + 0.2 == 0.3 // 在多数语言中返回 False(实际值是 0.30000000000000004)
我们可以看到,两个浮点数由于存在精度问题,所以是无法直接判断是否相等的,那么这是为什么呢,又应该如何解决呢?
2. 浮点数出现精度问题的原因:
浮点数(例如 double
类型)在计算机中是按照 IEEE 754 标准存储的。这种表示方式由三个部分组成:
- 符号位(Sign bit):1 位,用于表示正负数。
0
表示正数,1
表示负数。 - 指数部分(Exponent):用于表示数值的大小范围。对于
double
类型,占用 11 位。 - 尾数部分(Mantissa or Fraction):用于表示有效数字(精度部分),
double
类型占用 52 位。
由于十进制小数通过乘二取整法转换成二进制小数后往往是一个无限循环小数,但是计算机存储的尾数部分长度是有限的,所以就会对无限循环小数进行截断,我们在使用的时候,使用的是截断后的二进制数据转换成十进制后的数据 ,这样就导致了误差的产生。下面是具体的例子:
1 | // 定义三个double类型的浮点数a, b, c |
3. 浮点数精度问题的解决方法:
想要解决浮点数的精度问题,首先要规定一个误差精度,当误差的值比这个精度小的话,就认为没有误差,误差的精度需要根据具体的业务进行设计。
1 | // 设置精度 |
常见问题的解决方法:
1 | // 假设业务中的浮点数计算的误差精度不会超过1e-8,浮点数类型按double计算 |
可以直接比较大小的情况:如果是以下的两种情况,两个浮点数可以直接比较大小,精度误差不影响最终结果
- 如果比较大小的两个浮点数都是直接定义的或者直接从数据库获取,并且都没有参数过浮点数运算
- 非常明确这两个浮点数不会存在相等的情况。
4. 精度问题总结:
如果想要使用浮点数比较大小的话有两种简单的方法,一种方法是使用round
函数,把浮点数的精度限定在一个规定的精度内,在这个精度内进行比较大小;一种方法是定义一个精度epsilon
,通过让浮点数和epsilon
进行比较来判断浮点数的正负或者两个浮点数的大小关系。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果