新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python数字类型与运算全解析:从int到浮点数精度

发布时间:2026/9/28 8:39:50来源:尧图网络
Python数字类型与运算全解析:从int到浮点数精度
1. 数字类型全景Python的数字远比你想的更有意思很多人都觉得数字有什么好讲的不就是整数、小数嘛。但Python里的数字类型从设计思路上就和C、Java这些语言不太一样。如果你是从C语言转过来的第一次看到Python的整数没有位数上限应该会有点震惊。Python的数字体系本身不复杂但把底层的设计逻辑搞清楚后面学函数、学模块、学数据分析都会顺很多。在Python里数字主要分为四种类型int整数、float浮点数、complex复数还有一个经常被忽略的bool布尔值。这四个类型里int和float是日常用得最多的bool本质上是int的子类complex在科学计算里很常见但对大多数初学者来说知道怎么用就够了不一定要深入进去。很多人学Python学了很久还是搞不清楚1和1.0有什么区别更别说理解True和1之间的关系了。其实这些问题的答案都藏在这四种类型的设计里。掌握了它们之间的关系你就明白了为什么有些代码会报错为什么有些代码看起来奇怪但能正常运行。1.1 四大家族int、float、complex、bool先说整数int。Python的整数是任意精度的也就是说你可以写一个上百位的数字Python照样能精确处理不会像C语言那样溢出。这一点在写算法题或者做一些需要大数计算的场景时特别爽比如计算2**1000Java里得用BigIntegerPython里直接写就行。浮点数float是Python里最容易让人踩坑的类型。它本质上是C语言的double也就是双精度浮点数遵循IEEE 754标准。这意味着它内部是用二进制存储的而二进制的浮点数没法精确表示很多十进制的小数。最经典的例子就是0.1 0.2在Python里跑一下结果是0.30000000000000004不是0.3。这不是Python的bug是所有用IEEE 754标准的编程语言都有的问题。复数complex在Python里的写法很直接比如3 4j注意虚数单位是j不是i。复数类型在信号处理、电路分析这些领域经常用到但如果你只是学基础知道有这回事就够了后面要用的时候自然会用到。最后是bool它是个特殊的存在。True和False在Python里本质上就是1和0。你可以试试True 1结果是2。bool是int的子类这意味着它在很多场景下可以当整数用。但这个特点也容易让人犯迷糊比如True 1是TrueTrue is 1却是False因为它们在内存里是不同的对象。1.2 为什么Python的整数不会溢出这个问题的答案得从Python的底层实现说起。Python的整数不是直接映射到CPU的寄存器而是用一个结构体来存储的。当数字比较小的时候Python会把它当作一个普通的机器整数来处理速度很快当数字超出机器整数的范围时Python会自动把它转成大整数表示用多个机器整数拼起来存储。我打个比方一个豆腐块就是一个普通的整数盒子能装下的数字范围有限。超过这个范围Python就自动给你拿几个豆腐块拼在一起用这就是大整数的原理。这样做的好处是你永远不用担心溢出但代价是运算速度会慢一点点尤其是非常大的数字做运算的时候。我在实际教学里经常让学生试试这行代码print(2 ** 1000)看到跑出来的这个几百位的数字大部分人都会愣一下。在C语言里早就溢出了在Python里却毫发无损。这就是Python在设计上用户友好的体现之一。1.3 浮点数的不精确到底是怎么回事浮点数的不精确问题是每个Python初学者都会遇到的但没几个人真正解释清楚过。我换个方式说让人更容易理解。你在十进制下写1/3得到的最终结果永远是一个循环小数0.3333...不管你写多少位都写不完。同理二进制下1/10也是一个无限循环小数0.0001100110011...但计算机的存储空间是有限的所以只能截取一段近似值存下来。所以0.1 0.2不等于0.3不是Python的锅而是二进制本身没法精确表示这些十进制小数的数学事实。这个问题的通用解决方案我后面会专门讲这里先不展开。2. 算术运算那些看起来简单但暗藏陷阱的运算符数数字类型就绕不开运算符。Python的算术运算符和别的主流语言大同小异、-、*、/、//、%、**但其中有几个运算符的细节是很容易出错的。特别是//和%对负数取整和取余的行为很多人一开始都理解不了。还有一个让新人懵圈的点/和//的区别。在Python 2时代/的规则和现在不一样那时候整数除以整数得到的是整数。Python 3改了规则/做的是真正的除法永远返回浮点数。比如5 / 2结果是2.5这和C语言非常不一样我见过不少从C语言转过来的朋友在这里习惯性踩坑。2.1 运算优先级与结合性一个表达式里谁先谁后运算优先级是基础中的基础不搞清楚的话写出来的表达式可能和你心里想的完全不一样。Python的算术运算优先级从高到低大概是幂运算**、正负号x/-x、乘法除法取整除余*//////%、加减/-。有一个细节挺容易搞混的**的优先级比负号高所以-2 ** 2的结果是-4不是4。因为Python会把-2 ** 2看作-(2 ** 2)。如果你想要的是负二的平方得写(-2) ** 2。我自己见过很多人在写负数幂运算的时候在这上面吃了亏。另外幂运算符是右结合的也就是2 ** 3 ** 2的计算方式是2 ** (3 ** 2)结果是512不是64。这个是从数学上的习惯来的如果你不确定最好用括号把意图写清楚既方便自己看也好让别人读代码。2.2 //和%整除和取余负数怎么办//是整除它的规则是向下取整不是向零取整。这两个概念在正数上没有区别但一旦数字变负数结果就完全不同了。我经常问学生一个问题-7 // 2等于多少很多人第一反应是-3因为-7 / 2 -3.5取整的话有人会直接截断小数点那就变成-3了。但Python的答案是-4因为-4 * 2 -8这是不大于-7的整数里最接近-7的那个。也就是说//的结果是向负无穷方向取整。相应的%取余的规则也和这个绑定。-7 % 2在Python里是1因为-7 (-4) * 2 1。这个余数为正的特性有时候反而是好事。比如在写循环队列、循环列表的时候用%去算索引如果索引有可能为负Python的%保证结果永远是非负的直接省掉了很多判断。当然如果你确实想要向零取整的效果可以用int(-7 / 2)这样结果是-3。2.3 幂运算与math模块能别自己造轮子就别造**做幂运算已经很方便了但Python还有一个math模块里面内置了大量数学函数包括sqrt开平方、ceil向上取整、floor向下取整、fabs绝对值、pow幂运算和**的区别在于可以传第三个参数做模运算等等。建议初学者从第一天就用math.sqrt而不是x ** 0.5不是说后者不对而是math模块的函数往往有更好的可读性而且还能避免一些边界情况的坑。比如math.isclose这个函数就是专门用来比较两个浮点数是否足够接近的这个在第5节里我会细讲。3. 类型转换与格式化让数字变成你需要的样子Python里数字类型之间可以互相转换。int()、float()、bool()、complex()这几个内置函数就是干这个的。但别以为转换就是简单地把一个数变成另一个数这里面有不少细节值得注意特别是从字符串转换为数字还有进制转换都是实际写代码时高频出现的问题。格式化输出也是绕不开的。同样是一个数字3.14159你要在界面上展示保留两位小数的效果或者输出成百分数需要用到字符串格式化的知识。Python 3.6之后推出的f-string在可读性和易用性上比之前的%格式化和format()函数都强太多现在写代码首选的方案就是它。3.1 int()、float()、bool()的倔脾气先说说int()。它接收的参数可以是字符串、浮点数也可以是别的数字类型。但用int()转换字符串时字符串必须是一个看起来像整数的样子比如int(123)没问题但int(3.14)会直接报ValueError。这是因为int()的字符串解析规则不接受小数点的存在。如果你真的想从字符串3.14得到整数3就得走两步先float(3.14)得到3.14再int(3.14)得到3。注意int(3.14)的行为是向零截断不是四舍五入也不是向下取整。所以int(-3.14)得到的是-3不是-4。这个细节特别容易被忽视。其次再说float()。它可以把整数字符串、浮点数字符串转成浮点数。float(3)得到3.0float(3.14)得到3.14。但float(3.14abc)这种带其他字符的字符串同样会报错。这算是最基础的健壮性问题等后面学到try/except之后你可以用异常处理来优雅地应对这类输入。bool()的转换规则出乎很多人意料空字符串、0、0.0、空的列表字典元组集合、None这些转成布尔值都是False其他值转出来都是True。所以bool(False)是True因为字符串False非空。这确实容易让人懵但其实规则很统一空才是假非空就是真。3.2 格式化输出的三种姿势%格式化、format()、f-string我先直接说结论新代码建议一律用f-string。它的语法最简单性能也很好可读性最高。f-string长这样pi 3.1415926 print(f圆周率约等于 {pi:.2f}) # 输出圆周率约等于 3.14{pi:.2f}的意思是把变量pi以浮点数格式输出保留两位小数。如果你想输出千分位分隔符可以这样写num 1234567 print(f{num:,}) # 输出1,234,567如果你想把数字按百分比输出rate 0.85 print(f通过率{rate:.1%}) # 输出通过率85.0%这些格式化的小技巧往深里挖还有很多。比如对齐用、、^符号填充用0等等。具体语法可以查官方文档但我的建议是先把f-string最常用的几种格式吃透后续有需要再慢慢补充。3.3 字符串与数字的相爱相杀input()的坑十个人里有九个在这里踩过坑。你写一个加法程序a input(请输入第一个数字) b input(请输入第二个数字) print(a b)输入3和5结果打印出来是35。很多人第一次看到这个结果都会一脸问号原因很简单input()返回的是字符串5和3相加是字符串拼接得到35不是数学意义上的8。正确的做法是先转成数字再运算a int(input(请输入第一个数字)) b int(input(请输入第二个数字)) print(a b)这是一个非常经典的教学案例它提醒你一件事永远别忘记检查变量的类型。Python是动态类型语言不代表类型不重要恰恰因为类型是动态的更容易在某个不经意的操作里出问题。平时多练多用type()去查看变量类型会帮你养成好习惯。4. 实战案例从理论到能跑的代码纸上谈兵没意思我直接带你把这一讲的数字知识用起来。不需要太复杂三个小例子就够一个BMI计算器一个数字处理的综合小脚本还有一个涉及随机数和进制转换的练习。这三个例子能覆盖大部分数字类型和运算符的使用场景。这些代码我建议你都亲手敲一遍哪怕你觉得很简单。敲代码和看代码完全是两回事手上有感觉了后面写更复杂的逻辑才不容易卡壳。4.1 小项目写一个BMI计算器BMI身体质量指数的计算公式是体重除以身高的平方体重单位是千克身高单位是米。这个例子看起来简单但用上了数字运算和格式化输出def calculate_bmi(): weight float(input(请输入体重千克)) height float(input(请输入身高米)) bmi weight / (height ** 2) print(f您的BMI指数是{bmi:.1f}) if bmi 18.5: print(体重偏低) elif bmi 24: print(体重正常) elif bmi 28: print(体重偏高) else: print(肥胖) calculate_bmi()注意我用的是float(input(...))而不是int(input(...))。因为身高和体重都可能有小数如果直接用int输入1.7就会报错。这个细节反应了类型转换时根据实际需要选择正确的类型的思维。4.2 综合小脚本处理一组数字再写一个稍微综合一点的脚本演示运算、判断、格式化输出一起上的效果。比如输入一个多位的整数输出它的位数、各位之和、倒序数num int(input(请输入一个整数)) num_str str(num) digit_count len(num_str) digit_sum sum(int(d) for d in num_str) reversed_num int(num_str[::-1]) print(f位数{digit_count}) print(f各位数字之和{digit_sum}) print(f倒序后{reversed_num})这个例子能练习的不止数字类型本身还涉及str和int之间的来回转换。注意int(0123)是不报错的结果是123但如果倒序后开头有0int()会自动把前导0去掉。这种隐藏的小规则只有实际跑过了才会有印象。4.3 随机数和进制转换玩点有意思的Python内置的random模块可以生成随机数。配合数字格式化可以做出一些好玩的东西比如造一个随机密码的简化版import random # 生成一个4位随机数字验证码 code random.randint(1000, 9999) print(f验证码是{code:04d}) # 生成一个随机浮点数 price random.uniform(10, 50) print(f随机价格{price:.2f} 元){code:04d}表示输出整数并补零到4位如果生成的是456就会显示0456。这种零填充的格式化写法在生成订单号、编号时很常用。进制转换也是数字类操作的经典场景。Python内置了三个函数hex()转十六进制、oct()转八进制、bin()转二进制num 255 print(hex(num)) # 0xff print(oct(num)) # 0o377 print(bin(num)) # 0b11111111 # 反过来把不同进制的字符串转回十进制 print(int(ff, 16)) # 255 print(int(377, 8)) # 255 print(int(11111111, 2)) # 255第二段代码里int(str, base)的用法在处理十六进制颜色值或网络协议里的二进制数据时特别常见。5. 新手最容易踩的坑挨个排一遍最后这部分是全文的精华。我讲Python基础讲了很多次见过最多的、反复出现的错误基本都集中在下面这几个场景里。把这些坑提前给你排掉可以省下很多排查bug的时间。记录一下大概是这六类浮点数比较、input()忘转换类型、//的取整方向、类型转换成功与否的判断、布尔值参与算术运算的迷惑行为以及格式化字符串的语法错误尤其早期版本Python不支持的f-string。5.1 浮点数相等比较为什么0.10.2不等于0.3这个坑太经典了。你做单元测试或者条件判断的时候千万别直接写if x 0.3这种代码。因为0.1 0.2在计算机内部算出来的是一个非常接近0.3但不完全等于0.3的数直接比较会返回False。解决方案之一是使用math.iscloseimport math result 0.1 0.2 print(math.isclose(result, 0.3)) # Trueisclose默认会判断两个数之差的绝对值允许的误差范围可以自己调。也可以用round(x, 2)把浮点数先保留两位小数再比较。但我更推荐isclose因为round在某些极端情况下仍会有舍入误差。此外如果你在写金融相关的程序涉及金额的计算就别用浮点数了改用decimal.Decimal模块。这个模块专门用于高精度的十进制运算算钱的时候非常稳。5.2 input()的返回值永远是字符串这个前面已经说过了但值得再强调一遍。写在用户输入处的int()转换不是锦上添花而是必需动作。你写任何涉及输入的代码第一反应应该是这是字符串我要转成我需要的数据类型。等到后面学文件读写、网络请求时这个习惯同样重要——从外部世界拿到的数据默认都是字符串。5.3 //的取整方向正负数结果不同我们已经分析过//是向下取整。7 // 2结果是3-7 // 2结果是-4。如果你想要的是向零取整就得用int(7 / 2)。很多数据处理的场景里这两种取整方式可能导致结果差1所以写代码之前最好先明确你要的是哪种我自己的习惯是如果语义上明确是有余数就往下取那用//如果只是把小数部分扔掉那就用int()。5.4 类型转换失败的报错处理盲目调用int()转换字符串是写健壮性代码的大忌。比如用户输入了abcint(abc)直接抛ValueError程序就崩了。处理这种情况的标准姿势是用异常捕获user_input input(请输入一个整数) try: num int(user_input) except ValueError: print(输入格式错误请输入整数)5.5 bool参与运算True12bool是int的子类这个特性导致了一些看起来奇怪但又合法的操作。True True结果是2False * 10结果是0。初学者看到这种代码往往一头雾水。在列表统计场景里这个特性其实挺方便比如sum([True, False, True, True])可以直接数出有3个True。但在阅读代码时如果你看到别人用布尔值做算术要能理解他的意图自己写代码时尽量别这么玩可读性优先。5.6 格式化输出的细节注意事项f-string里如果要用到大括号{}本身需要写双括号{{}}。比如score 95 print(f得分{{{score}}}) # 输出得分{95}另外要小心f{num:d}只能用于整数如果你传入一个浮点数3.0会报错。反过来f{num:f}可以用于整数和浮点数整数会被转成浮点数格式显示。这些细节多跑几次代码就记住了。最后再分享一个小技巧我在教学生数字这一讲的时候最喜欢让他们做的一个练习就是用一个脚本同时计算同一笔金额在不同折扣下的最终价格并要求输出对齐的表格效果。比如原价100元打8折、7.5折、6折分别多少钱。这个练习看着简单实际上覆盖了浮点数计算、格式化输出和类型转换三个核心点做完之后对数字的理解立刻就不一样了。学编程没有捷径多动手写、多调试才是增长经验最快的路希望这一讲能真正帮你打开Python数字世界的大门。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

JavaWeb期末大作业网上书店系统:从源码到跑通的完整指南 2026/9/28 9:41:14

JavaWeb期末大作业网上书店系统:从源码到跑通的完整指南

简介:基于JavaWeb的网上书店系统源码与数据库打包为zip,是面向JavaWeb课程设计及期末大作业场景的完整项目,适合在校生直接参考或提交。压缩包共108个文件,其中以31个Java源码、29个JSP页面、13个XML配置为主,辅以CSS样…

阅读更多 →
LDA主题模型实战:从中文分词到参数调优与可视化 2026/9/28 9:41:13

LDA主题模型实战:从中文分词到参数调优与可视化

简介:面向自然语言处理初学者与文本挖掘实践者,这份资源提供了基于Python的LDA主题模型实现代码。LDA作为应用最广泛的主题模型,通过推断文档中词语的共现模式,将每篇文档表示为若干主题的混合,资源即围绕这一核心流程…

阅读更多 →
STM32+MPU6050结合Nanoedge AI Studio实现电机异常检测实战指南 2026/9/28 9:41:13

STM32+MPU6050结合Nanoedge AI Studio实现电机异常检测实战指南

开局先说个真实经历:第一次把MPU6050接到STM32上做电机振动采集时,我以为最大的坎会是I2C时序、姿态解算或者滤波。结果整个项目里卡得最久的,反而是链接器吐出来的一句话:.\objects\project.axf: error: L6218E: undefined symbo…

阅读更多 →
为“类模块“编写 TypeScript 声明文件:module-class.d.ts 模板完全解析 2026/9/28 9:41:07

为“类模块“编写 TypeScript 声明文件:module-class.d.ts 模板完全解析

文档教程 【免费下载链接】TypeScript TypeScript 使用手册(中文版)翻译。http://www.typescriptlang.org 项目地址: https://gitcode.com/gh_mirrors/typ/TypeScript 点击查看 免费下载 本指南以 module-class.d.ts 模板 为主线&#xff0c…

阅读更多 →
用deepseek-v4-flash实现微信自动日报工作流 2026/9/28 9:41:00

用deepseek-v4-flash实现微信自动日报工作流

1. 项目概述:这不是“发个消息”,而是一套轻量级企业级自动化工作流“我给 WorkBuddy 设了个闹钟:每天上午十点半,一份 AI 日报自动送进微信”——这句话乍看像极了某个程序员朋友在茶水间随口聊起的小技巧,但拆开来看…

阅读更多 →
wordpress搭建个人店铺多少钱能搞定?新手避坑指南 2026/9/28 9:41:00

wordpress搭建个人店铺多少钱能搞定?新手避坑指南

wordpress搭建个人店铺多少钱能搞定?新手避坑指南 网站做好了没人访问,这绝对是建站圈最让人头大的事儿。很多小伙伴花了几千块找外包,或者自己折腾半天弄了个WordPress站点,结果上线三个月,后台一看,日均访客不到5个。这时候大家心…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉