pin_drop当前位置:知识文库 ❯ 图文
Python浮点数float详解
浮点数(Float)是Python中用于表示带有小数部分的数值的数据类型。Python的浮点数基于IEEE 754双精度浮点数标准实现,占用64位内存空间。浮点数在科学计算、金融分析和日常编程中广泛使用,但由于其底层的二进制表示方式,存在精度问题,这是每个Python程序员都需要理解的重要概念。
浮点数定义
直接定义
代码示例
a = 3.14
b = -0.5
c = 0.0
print(type(a))
print(type(b))
print(type(c))输出:
代码示例
<class 'float'>
<class 'float'>
<class 'float'>整数除法产生浮点数
代码示例
result = 10 / 3
print(result)
print(type(result))输出:
代码示例
3.3333333333333335
<class 'float'>提示:在Python 3中,除法运算
/始终返回浮点数,即使结果恰好是整数。
科学计数法
Python支持使用科学计数法(也称为指数记法)来表示非常大或非常小的浮点数:
代码示例
a = 1.5e3
b = 2.5e-4
c = 1e10
d = 3.14E2
print(a)
print(b)
print(c)
print(d)输出:
代码示例
1500.0
0.00025
10000000000.0
314.0
科学计数法的格式为:m e n,表示 m × 10ⁿ,其中e也可以大写为E。
浮点数精度问题
经典的0.1 + 0.2问题
代码示例
result = 0.1 + 0.2
print(result)
print(result == 0.3)输出:
代码示例
0.30000000000000004
False这是因为浮点数在计算机中以二进制存储,而许多十进制小数无法精确地用二进制表示,从而产生了微小的舍入误差。
精度问题的原因
浮点数使用64位存储,其中1位符号位、11位指数位、52位尾数位。这种有限的精度意味着:
-
只能精确表示有限数量的小数
-
大部分十进制小数在二进制中是无限循环的
-
运算过程中误差会累积
浮点数的特殊值
代码示例
import math
print(math.inf)
print(-math.inf)
print(math.nan)
print(math.inf + 1)
print(math.nan == math.nan)输出:
代码示例
inf
-inf
nan
inf
False提示:
inf表示无穷大,-inf表示负无穷大,nan表示"不是一个数字"(Not a Number)。注意nan不等于任何值,包括它自己。
decimal模块
当需要精确的小数运算时(如金融计算),应使用decimal模块:
代码示例
from decimal import Decimal, getcontext
getcontext().prec = 6
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b)
print(a + b == Decimal('0.3'))输出:
代码示例
0.3
Truedecimal与float对比
代码示例
from decimal import Decimal
float_result = 0.1 + 0.2
decimal_result = Decimal('0.1') + Decimal('0.2')
print(f"float: {float_result}")
print(f"decimal: {decimal_result}")输出:
代码示例
float: 0.30000000000000004
decimal: 0.3提示:使用
Decimal时,务必用字符串构造,而非浮点数。Decimal(0.1)会将浮点数的误差带入,而Decimal('0.1')才是精确的。
设置精度
代码示例
from decimal import Decimal, getcontext
getcontext().prec = 28
a = Decimal('1') / Decimal('3')
print(a)输出:
代码示例
0.3333333333333333333333333333浮点数运算
算术运算
代码示例
a = 3.14
b = 2.0
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a // b)
print(a % b)
print(a ** b)输出:
代码示例
5.140000000000001
1.1400000000000001
6.28
1.57
1.0
1.1400000000000001
9.8596math模块常用函数
代码示例
import math
print(math.sqrt(2.0))
print(math.ceil(3.2))
print(math.floor(3.8))
print(math.fabs(-5.5))
print(math.pow(2.0, 3.0))
print(math.log(math.e))输出:
代码示例
1.4142135623730951
4
3
5.5
8.0
1.0浮点数比较
由于精度问题,不建议直接使用==比较浮点数,推荐使用math.isclose():
代码示例
import math
a = 0.1 + 0.2
b = 0.3
print(a == b)
print(math.isclose(a, b))
print(math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0))输出:
代码示例
False
True
True代码示例
示例1:浮点数精度演示
代码示例
def show_precision():
values = [0.1, 0.2, 0.3, 0.1 + 0.2]
for v in values:
print(f"{v:.20f}")
show_precision()输出:
代码示例
0.10000000000000000555
0.20000000000000001110
0.29999999999999998890
0.30000000000000004441示例2:金融计算使用decimal
代码示例
from decimal import Decimal
price = Decimal('19.99')
quantity = Decimal('3')
tax_rate = Decimal('0.08')
subtotal = price * quantity
tax = subtotal * tax_rate
total = subtotal + tax
print(f"单价: {price}")
print(f"数量: {quantity}")
print(f"小计: {subtotal}")
print(f"税费: {tax}")
print(f"总计: {total}")输出:
代码示例
单价: 19.99
数量: 3
小计: 59.97
税费: 4.7976
总计: 64.7676注意事项
浮点数存在精度问题,不要用
==直接比较两个浮点数,应使用math.isclose()。金融计算等需要精确结果的场景,务必使用
decimal模块。使用
Decimal时要用字符串初始化,如Decimal('0.1'),而非Decimal(0.1)。浮点数的范围约为±1.8×10³⁰⁸,超出范围会产生
inf。
nan不等于任何值,判断是否为nan应使用math.isnan()。整数和浮点数混合运算时,结果自动为浮点数。
小结
本节介绍了Python浮点数类型的核心知识:
-
浮点数基于IEEE 754双精度标准,存在精度问题
-
支持科学计数法表示,格式为
m e n -
0.1 + 0.2 != 0.3是经典的精度问题 -
decimal模块提供了精确的十进制运算 -
使用
math.isclose()比较浮点数,而非== -
math模块提供了丰富的数学函数
练习题
练习1
编写一个函数is_equal(a, b, tolerance=1e-9),判断两个浮点数是否在给定容差范围内相等,不使用math.isclose()。
提示:计算两个数的差的绝对值,与容差比较。
练习2
使用decimal模块计算圆的面积,圆的半径为2.5,π取Decimal('3.141592653589793'),结果保留28位精度。
提示:使用getcontext().prec设置精度,使用Decimal进行运算。
常见问题
为什么0.1 + 0.2不等于0.3?
因为浮点数在计算机中以二进制存储,而0.1和0.2在二进制中是无限循环小数,无法精确表示,从而产生了微小的舍入误差。这是IEEE 754浮点数标准的设计决定的。
如何正确比较两个浮点数?
推荐使用math.isclose()函数来比较浮点数,它可以设置相对容差和绝对容差。例如:math.isclose(a, b, rel_tol=1e-9)。
什么时候应该使用decimal模块?
当需要精确的小数运算时,如金融计算、货币处理等场景,应该使用decimal模块。使用Decimal时要用字符串初始化,如Decimal('0.1'),而非Decimal(0.1)。
什么是科学计数法?如何在Python中使用?
科学计数法是一种表示非常大或非常小的数字的方法,格式为m e n,表示m × 10ⁿ。在Python中可以直接使用,如1.5e3表示1500.0,2.5e-4表示0.00025。
本文涉及AI创作
内容由AI创作,请仔细甄别