Python的浮点数

        在 Python 中,有四种内置数值类型,分别是整型整数类型(int)、布尔类型(bool)、浮点数类型(float)和复数类型(complex)。浮点数默认是双精度类型,占8个字节(64bit)的内存空间,可提供最多17位有效数字。浮点数的 有效数字(Significant Digits) 可以通过多种方式处理。

先了解一下什么是有效数字。有效数字通常指的是一个数中从第一个非零数字开始到最后一个数字之间的所有数字,包括末尾的零(不包括小数点)。例如,12.340有五位有效数字。

1. 浮点数的默认精度

Python 的浮点数遵循 IEEE 754 双精度标准(也就是基于双精度浮点数的),通常提供约 15-17 位有效数字。例如:

x = 1.2345678901234567 # 有效数字约 16 位 print(x) # 输出:1.2345678901234567

那么双精度浮点数占8个字节(64bit)的内存空间,与有效数字之间有什么关系呢?

Python中的浮点数默认采用IEEE 754双精度格式64位),其二进制存储结构如下:

  • 符号位(1位):表示正负(0为正,1为负)。
  • 指数部分(11位):用于调整小数点的位置(偏移量编码)。
  • 尾数部分(52位):存储有效数字(二进制小数)。

2. 有效数字的二进制位数

  • 总有效位数53位二进制(含隐含的1个前导位)。
    • 尾数显式存储52位,但实际有效位数为52 + 1(隐含的1.xxx...形式)。
  • 十进制精度:约15~17位有效数字二进制53位转换为十进制的结果),但二进制与十进制的转换可能导致误差。

3. 整数部分和小数部分的动态分配

IEEE 754浮点数的核心是科学计数法,并不是小数和整数部分分开存储的,其整数和小数部分的二进制位数由指数动态决定。

科学计数法,也就是有效数字加上指数的方式。所以整数和小数部分的二进制位数会根据指数的值而变化。例如,当指数为正时,整数部分可能有更多位,而小数部分则少;指数为负时,整数部分可能为零,小数部分较多。

  • 示例1:数字8.5的二进制为1000.1,存储为:

    1.0001\times 2^{3}

    • 整数部分:1000(4位二进制)
    • 小数部分:.1(1位二进制)
  • 示例2:数字0.375的二进制为0.011,存储为:

    1.1\times 2^{-2}

    • 整数部分:0
    • 小数部分:.011(3位二进制)

关键注意事项

(1)动态调整:整数和小数部分的位数不固定,由指数值决定。例如:2^10的浮点数会比2^{-10}分配更多位给整数部分。

(2)精度限制:如果整数部分二进制位数超过53位,小数部分将丢失精度。例如:2^{53} + 1无法精确表示,会被舍入为2^{53}

# 查看浮点数的二进制表示 
import sys 
x = 8.5 
print(bin(sys.float_info.epsilon)) # 输出最小精度差异的二进制 
print(format(x, '.60f')) # 观察小数精度截断

sys.float_info.max   # 浮点数晨大值
# 结果为:1.7976931348623157e+308
sys.float_info.min   # 浮点数最小值
# 结果为:2.2250738585072014e-308

4. 控制显示的有效数字

若需将浮点数格式化为特定有效数字的字符串,可以使用 字符串格式化round 函数。

方法 1:format 函数(推荐)
  • 格式说明符 g:自动选择科学计数法或定点表示法,保留指定有效数字。

    x = 123.456789 
    print("{:.3g}".format(x)) # 输出:123(3 位有效数字) 
    print("{:.5g}".format(x)) # 输出:123.46(5 位有效数字)
  • 格式说明符 e:强制科学计数法。

    print("{:.3e}".format(0.000123456)) # 输出:1.235e-04(3 位有效数字)
方法 2:round 函数
  • round(number, ndigits) 可四舍五入到指定小数位,但需结合量级调整以实现有效数字:
    x = 123.456789 
    rounded = round(x, 2 - len(str(int(x)))) # 保留 3 位有效数字 
    print(rounded) # 输出:123.0

5. 高精度计算:decimal 模块

若需严格控制有效数字(如金融计算),可使用 decimal 模块:

from decimal import Decimal, getcontext 
# 设置全局有效数字为 5 
getcontext().prec = 5 
x = Decimal("123.456789") # 必须用字符串初始化避免浮点误差 
y = Decimal("0.987654") 
result = x + y print(result) # 输出:124.44(自动保留 5 位有效数字)

6. 浮点数精度陷阱

注意浮点数的二进制表示可能导致精度丢失:

print(0.1 + 0.2) # 输出:0.30000000000000004(二进制无法精确表示十进制小数)

此时应使用 decimal 模块避免问题。

7. 总结:方法对比

方法适用场景示例
字符串格式化显示或输出控制"{:.3g}".format(123.456) → `123`
round 函数简单四舍五入round(123.456, 2) → `123.46`
decimal 模块高精度计算或严格有效数字控制Decimal("123.456").quantize(...)

常见问题

  • Q:为什么 round(2.675, 2) 得到 2.67 而不是 2.68
    A:浮点数二进制精度问题导致舍入误差,建议用 decimal 模块。

  • Q:如何直接获取浮点数的所有有效数字?
    A:转换为字符串后处理(需注意科学计数法):

    def get_significant_digits(x): return len(str(x).replace(".", "").lstrip("0").rstrip("0")) print(get_significant_digits(0.00123400)) # 输出:5(有效数字 12340)

通过以上方法,你可以灵活控制 Python 浮点数的有效数字,满足不同场景需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始 | C语言基础刷题DAY1

❤个人主页:折枝寄北的博客 DAY1[2025.3.11] 1. 求两个数的较大值2.从键盘输入的两个数的大小关系3.一个整数的奇偶性,请判断4. 考试分数是否通过5.考试成绩是否完美,请判断 1. 求两个数的较大值 题目: 写一个函数求两个整数的较…

[pytest] 配置

这里写目录标题 PytestInitRun3. 根据命令行选项将不同的值传递给测试函数 Report1. 向测试报告标题添加信息2. 分析测试持续时间 pytest --durations33. 增量测试 - 测试步骤--junitxml{report}.xml1. testsuite1.1 在测试套件级别添加属性节点 record_testsuite_property 2. …

物联网商业模式

物联网商业模式是一种战略规划,它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于,它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中,这种商业模式通过利用实时数据来提供创新服务…

springboot432-基于SpringBoot的酒店管理系统(源码+数据库+纯前后端分离+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

Manus AI:开启Agent元年的ChatGPT时刻(附赠资料)

1. Manus AI:全球首个通用Agent Manus AI 是全球首个通用人工智能代理,连接思想与行动,不仅思考,还能交付成果。Manus 擅长处理工作和生活中的各种任务,帮助用户完成一切。其核心理念是“less structure, more intell…

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆,邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible ; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

从零使用docker并安装部署mysql8.3.0容器

在开始使用docker到完成mysql的安装部署,中间有很多的坑等着 安装docker并配置 sudo yum install docker-ce 启动docker并设置开机启动项 sudo systemctl start docker sudo systemctl enable docker查看docker是否启动 sudo systemctl status docker 或者直接…

golang 静态库 Undefined symbol: __mingw_vfprintf

正常用golang编译一个静态库给 其他语言 调用,编译时报错 Error: Undefined symbol: __mingw_vfprintf 很是奇怪,之前用用golang写静态库成功过,编译也没问题,结果却是截然不同。 试了很多次,发现唯一的差别就是在 …

如何下载一些网上只提供了预览的pdf

有些网站上提供了pdf的预览,但是不提供下载入口 这时候用浏览器调出开发人员工具(F12),找Fetch/XHR这个选项,里看启动器中有pdf的那个文件,点选 它。 然后就能找到它的网址了,直接把这个网址选中&#xff…

力扣-数组-34 在排序数组中查找元素的第一个和最后一个位置

思路和时间复杂度 思路&#xff1a;先找到中间数&#xff0c;如果没找到就返回{-1&#xff0c;-1}&#xff0c;如果找到了就以当前节点为中点&#xff0c;向两边扩时间复杂度&#xff1a; 代码 class Solution { public:vector<int> searchRange(vector<int…

一二三应用开发平台——能力扩展:多数据源支持

背景 随着项目规模的扩大&#xff0c;单一数据源已无法满足复杂业务需求&#xff0c;多数据源应运而生。 技术选型 MyBatis-Plus 的官网提供了两种多数据源扩展插件&#xff1a;开源生态的 <font style"color:rgb(53, 56, 65);">dynamic-datasource</fon…

NAFNet:Simple Baselines for Image Restoration

Abstract 近年来&#xff0c;图像复原技术取得了长足的进步&#xff0c;但现有的图像复原方法&#xff08;SOTA&#xff09;系统复杂度也在不断增加&#xff0c;不利于对各种方法的分析和比较。在本文中&#xff0c;我们提出了一种简单的基线&#xff0c;它超越了SOTA方法&…

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…

基于springboot和spring-boot-starter-data-jpa快速操作mysql数据库

1、创建springboot项目 2、pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

【Spring】基础/体系结构/核心模块

概述&#xff1a; Spring 是另一个主流的 Java Web 开发框架&#xff0c;该框架是一个轻量级的应用框架。 Spring 是分层的 Java SE/EE full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse of Control&#xff0c;控制反转&#xff09;和 AOP&#xff08;Aspect…

VMware安装Windows server 2016

1、新建虚拟机&#xff0c;选择自定义模式 2、选择兼容性 4、命名虚拟机 5、固件类型 EFI 虚拟磁盘类型&#xff0c;不同电脑推荐的类型不同&#xff0c;用默认的就行 删除声卡和打印机 检查网络配置 选择本地的Windows server 2016的系统镜像&#xff0c;系统镜像可以去Window…

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…

使用Process Explorer、Dependency Walker和PE信息查看工具快速排查dll动态库因库与库版本不一致导致的加载失败问题

目录 1、问题说明 2、使用Process Explorer查看目标dll动态库有没有动态加载起来 3、使用Dependency Walker查看xxpadll.dll库的库依赖关系&#xff0c;找到xxpadll.dll加载失败的原因 4、使用PE信息查看工具查看目标dll库的时间戳 5、关于xxsipstack2.dll中调用xxdatanet…

NCCL如何打印XML拓扑文件,操作说明和源码展示

NCCL源码解读的视频在这&#xff1a;NCCL集合通信源码解读、案例、任务调度、拓扑_哔哩哔哩_bilibili 一、环境变量设置 1.1 命令行环境变量设置 为了打印XML拓扑文件&#xff0c;需要设置NCCL的环境变量NCCL_TOPO_DUMP_FILE。这个环境变量指定了XML拓扑文件的输出路径和文件…

时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍

化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累&#xff0c;精准聚焦行业痛点&#xff0c;并携手 TDengine 提供高效解决方案。通过应用 TDengine&#xff0c;力川科技助力化工企业实现…