当前位置: 首页 > news >正文

Python 浮点数(float)类型详解

在Python中,浮点数(float)类型用于表示带有小数部分的数字。尽管它们看起来简单直接,但浮点数在计算机内部的表示方式导致了一些独特的行为和需要注意的地方。

1. 浮点数基础

1.1 浮点数表示

Python使用IEEE 754双精度浮点数(64位):

a = 3.14
b = 1.23e-4  # 科学计数法 0.000123
c = float('inf')  # 无穷大
d = float('nan')   # 非数字

1.2 类型检查

type(3.14)        # <class 'float'>
isinstance(3.14, float)  # True

2. 底层实现

2.1 IEEE 754双精度格式

  • 1位符号位
  • 11位指数位(偏移量1023)
  • 52位尾数位(隐含前导1)
  • 范围:约 ±1.8×10³⁰⁸
  • 精度:约15-17位有效数字

2.2 内存表示

import sys
sys.getsizeof(3.14)  # 24字节(Python对象开销+8字节数据)

2.3 特殊值

float('inf')  # 正无穷
float('-inf') # 负无穷
float('nan')  # 非数字
math.isinf(1e308 * 10)  # True
math.isnan(float('nan')) # True

3. 浮点运算特性

3.1 精度问题

0.1 + 0.2 == 0.3  # False
print(0.1 + 0.2)   # 0.30000000000000004

3.2 解决方案

# 方法1:允许误差范围
abs(0.1 + 0.2 - 0.3) < 1e-10  # True# 方法2:使用decimal模块
from decimal import Decimal
Decimal('0.1') + Decimal('0.2') == Decimal('0.3')  # True

4. 数学运算

4.1 基础运算

3.14 + 2.71  # 5.85
3.14 - 2.71  # 0.43
3.14 * 2.0   # 6.28
3.14 / 2.0   # 1.57
3.14 // 2.0  # 1.0 (地板除)
3.14 % 2.0   # 1.14
3.14 ** 2.0  # 9.8596

4.2 数学函数

import math
math.sqrt(2.0)    # 1.4142135623730951
math.sin(math.pi) # 1.2246467991473532e-16 (近似0)
math.floor(3.99)  # 3
math.ceil(3.01)   # 4
math.isclose(0.1+0.2, 0.3)  # True

5. 高级特性

5.1 浮点数解析

float.fromhex('0x1.ffffp10')  # 2047.984375
3.14.hex()  # '0x1.91eb851eb851fp+1'

5.2 浮点数精度控制

# 使用round函数
round(3.1415926, 4)  # 3.1416# 格式化输出
format(3.1415926, '.4f')  # '3.1416'
f"{3.1415926:.4f}"       # '3.1416'

6. 性能优化

6.1 避免重复计算

# 较差
for x in data:y = math.sin(x) * 10# 较好
sin = math.sin
for x in data:y = sin(x) * 10

6.2 使用math模块

# 比内置运算符更快
math.fsum([0.1]*10)  # 更精确的求和

7. 特殊场景处理

7.1 大数相加

# 可能丢失精度
1e20 + 1 == 1e20  # True# 解决方案
math.fsum([1e20, 1])  # 1e20 + 1 = 1e20 (仍无法解决)

7.2 比较浮点数

# 错误方式
a = 0.1 + 0.2
b = 0.3
a == b  # False# 正确方式
math.isclose(a, b)  # True
abs(a - b) < 1e-9   # True

8. 扩展应用

8.1 科学计算

import numpy as np
np.float64(3.14)  # 更精确的64位浮点

8.2 金融计算

from decimal import Decimal, getcontext
getcontext().prec = 6
Decimal(1) / Decimal(7)  # Decimal('0.142857')

9. 安全注意事项

9.1 避免精度丢失

# 大数加小数
(1e20 + -1e20) + 1  # 1.0
1e20 + (-1e20 + 1)  # 0.0

9.2 输入验证

try:x = float(user_input)
except ValueError:print("Invalid float")
http://www.xdnf.cn/news/276481.html

相关文章:

  • 苍穹外卖12
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.4 数据重复与去重(IDENTITY COLUMN/UNIQUE约束)
  • 什么是unordered_set?用大白话说
  • 智能工厂自主优化:从局部调优到全局演进
  • NPP库中libnpps模块介绍
  • 【时时三省】(C语言基础)怎样定义和引用一维数组
  • C++23 std::tuple与其他元组式对象的兼容 (P2165R4)
  • SpringMVC-第二章之RequestMapping注解详解
  • 【ArcGIS微课1000例】0144:沿线或多边形要素添加折点,将曲线线段(贝塞尔、圆弧和椭圆弧)替换为线段。
  • 什么是JDBC
  • 算法每日一题 | 入门-顺序结构-大象喝水
  • 课程10. 聚类问题
  • JavaScript 性能优化之框架 / 工程层面的优化
  • AI:机器学习之强化学习
  • 实时在线状态
  • 硬件加速模式Chrome(Edge)闪屏
  • 学习黑客 ATTCK
  • 2025年PMP 学习二
  • Java设计模式: 实战案例解析
  • llfc项目笔记客户端TCP
  • 浏览器性能优化
  • Django框架介绍+安装
  • 栈Stack
  • 《解锁SCSS算术运算:构建灵动样式的奥秘》
  • 性能优化实践:性能监控体系
  • 单调栈与单调队列(c艹)、可视化Qt?
  • 2025.4.28-20025.5.4学习周报
  • 前端小练习————表白墙+猜数字小游戏
  • Nx 智能分发机制(Nx Agents + Nx Cloud)
  • 48变现干货:分销裂变方式提高销量