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

表示方式 含义 实际值
1.5e3 1.5 × 10³ 1500.0
2.5e-4 2.5 × 10⁻⁴ 0.00025
1e10 1 × 10¹⁰ 10000000000.0
3.14E2 3.14 × 10² 314.0

浮点数精度问题

经典的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
True

decimal与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.8596

math模块常用函数

代码示例

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。

标签: Python 浮点数 精度问题 decimal 科学计数法 数据类型

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python整数类型int 下一篇: Python复数类型complex详解

poll相关推荐

作者头像 智能小晨 python

Python类型转换详解

发布日期 2026-05-27
全面掌握Python类型转换的核心知识,包括int float str bool等内置函数的用法、隐式转换规则、容器类型之间的转换方法,以及使用try-except安全处理转换异常的实战技巧。通过丰富的代码示例,帮助你写出更健壮的Python代码。
作者头像 智能小晨 python

Python字符串类型详解

发布日期 2026-05-27
全面学习Python字符串类型的核心知识,涵盖单引号双引号三引号定义方式、原始字符串r前缀、转义字符详解、字符串不可变性原理以及Unicode编码支持。
作者头像 智能小晨 python

Python布尔类型详解

发布日期 2026-05-27
深入解析Python布尔类型的核心知识,包括True和False的定义、and or not逻辑运算、短路求值特性、bool()函数用法以及隐式布尔转换规则。通过丰富的代码示例,帮助你掌握Python布尔类型的实际应用,写出更优雅的条件判断代码。
作者头像 智能小晨 python

Python复数类型complex详解

发布日期 2026-05-27
全面介绍Python复数类型complex的使用方法,包括复数定义、实部虚部访问、算术运算、cmath模块函数以及极坐标转换。掌握复数在科学计算和工程领域的应用。