【Python】浮点数陷阱
浮点数陷阱
1. 判断:
print(0.1 + 0.2 == 0.3)输出:
False2. 判断
print(1e50 == 10 ** 50)输出:
False3. 判断:
print(1e500 == 1e600)输出:
True4. 判断:
print(1e500 > 10 ** 1000)输出:
True5. 判断:
print(1e500 * 1e500 > 0)输出:
True6. 判断:
print(1e500 / 1e500 > 0)输出:
False7. 判断:
print(1e500 / 1e500 == 1e500 / 1e500)输出:
False解析
- 计算机浮点数精度丢失导致
1e50是浮点数,10 ** 50是整数,整数是觉得精确的,浮点数会存在精度丢失。print(type(1e50), type(10 ** 50))输出:
<class 'float'> <class 'int'>python 里使用的是64位双精度浮点数,最大能到1e308,如果比这个数大就会自动转换为正无穷
float('inf')或者负无穷float('-inf')。print(1e500 == float('inf'), 1e600 == float('inf'))输出:
True True- 正无穷大于任何整数,负无穷小于任何整数。
- 正无穷乘以正无穷大于0。
正无穷除以正无穷结果为
nan。print(float('inf')/float('inf'))输出:
nannan和任何对象比较结果都为False。
PS. 浮点数永远不要用 == 来比较,应该比较两个浮点数的差值的绝对值小于某个给定的小数。
print(abs((0.1 + 0.2) - 0.3) < 1e-10)
评论区(暂无评论)