type
status
date
slug
summary
tags
category
icon
password
Property
May 24, 2025 07:51 AM
Python基础篇
一、基础回顾
注意事项,在Python中,除法的结果一定是小数,哪怕整除,结果也一定是小数

执行这个py文件你会发现,存在打印,这是因为,this中存在函数,在执行当前文件的时候,会自动运行所导入的this,实际上,你import是导入了一个py文件,import的作用就是导入一个模块或者包,一个py文件就可以当作一个模块,因此你实际上引入的是一个单独模块,单独文件,所以执行的时候,是执行了这个文件。
任何字段必须先定义后使用
有趣的现象:
py中做除法运算,有一个很奇怪的现象,为什么?
print(8 / 0.00001)
结果是
而
print(8 / 0.0001)
结果却是:
这应该是精度的问题
解答:
好的,我现在需要帮用户解决为什么在Python中,
print(8 / 0.00001)
会显示小数结果,而print(8 / 0.0001)
却显示正常的整数结果。用户之前提到过类似的浮点数问题,但这次的情况看起来不同,因为其中一个结果看起来“正常”。我需要结合用户提供的截图信息来分析。首先,用户上传的截图显示,在
test1.py
文件中,执行了print(8 / 0.0001)
,结果输出为80000.0
,进程退出代码0。用户的问题在于,当分母更小时(如0.00001),结果变成带有更多小数位的浮点数,而0.0001的情况结果看起来更“干净”。这可能让用户感到困惑,因为预期两者都应该返回整数形式的浮点数。接下来,我需要回忆之前关于浮点数精度问题的讨论。在之前的对话中,用户询问了8除以0.001得到799.999...的情况,我解释了浮点数的二进制存储限制导致的精度问题。现在的情况类似,但用户观察到不同的结果。需要确定为什么在某些情况下结果看起来更“整洁”,而其他情况则显示更多小数位。
首先,我需要考虑浮点数的表示方式。Python使用IEEE 754双精度浮点数,精度有限。当进行除法运算时,如果结果无法精确表示,就会出现舍入误差。例如,0.0001在二进制中可能是一个可以更精确表示的数值,而0.00001可能无法精确表示,导致结果出现更多的小数位。
为了验证这一点,我应该手动计算这两个表达式的结果。例如,8除以0.0001等于80000,而8除以0.00001等于800000。但关键在于这些数值在浮点数中的表示是否精确。
接下来,我需要检查0.0001和0.00001在二进制中的表示。0.0001可以表示为1/10000,而0.00001是1/100000。可能0.0001在二进制中的表示刚好是一个可以精确表示的分数,而0.00001则无法精确表示,导致除法后的结果出现误差。
此外,Python在打印浮点数时会自动进行舍入,但具体显示的小数位数取决于内部的表示方式。例如,当结果为整数时,可能会显示为x.0,但如果结果内部有微小的误差,例如800000.0000000001或799999.9999999999,Python可能会显示更多的小数位。
在用户提供的截图中,
print(8 / 0.0001)
的结果是80000.0
,这表明结果被正确表示为整数,没有可见的误差。而print(8 / 0.00001)
可能显示如800000.0000000001
或类似的,导致用户看到更多小数位。需要进一步验证这一点。例如,在Python中运行这两个表达式,看看实际输出是什么。如果用户得到的是800000.0,那么可能用户的测试案例有不同情况,但根据用户描述,他们得到的是带有小数的结果。可能用户在实际测试中遇到了不同的分母,比如0.00001和0.0001,但其中一个在二进制中更容易精确表示。
另外,可能用户的分母数值不同。例如,0.0001是10的-4次方,而0.00001是10的-5次方。10的幂次在二进制中的转换可能不同。例如,1/10在二进制中是无限循环的,因此任何以10为分母的除法都可能导致精度问题,但某些指数可能更容易被精确表示。
另一个角度是浮点数的动态范围。当结果非常大或非常小时,浮点数的精度会下降,导致更多的舍入误差。例如,当计算8 / 0.00001时,结果800000可能需要更多的有效位数,而双精度浮点数的尾数部分只有52位,可能不足以精确表示,从而导致舍入误差。
同时,Python的浮点数打印机制会根据数值的大小调整显示的小数位数。对于较大的整数结果,如果数值是精确的整数,它会显示为x.0;如果存在微小的误差,则会显示更多小数位。例如,80000.0可能是精确的,而800000.0可能有误差,导致显示更多小数位。
总结可能的原因:
- 分母的二进制表示不同:0.0001可能更容易被精确表示为二进制浮点数,而0.00001无法精确表示,导致除法结果的误差。
- 结果的大小不同:较大的结果可能接近浮点数的表示极限,导致精度损失。
- 打印时的舍入策略:Python自动舍入到一定小数位,但当误差较大时会显示更多小数。
最后,需要向用户解释这些可能性,并提供验证方法,比如使用decimal模块检查精确值,或者查看浮点数的十六进制表示,以确认是否存在精度误差。同时,建议用户在处理需要高精度的计算时使用decimal模块,以避免此类问题。
您在 Python 中观察到的
print(8 / 0.00001)
和 print(8 / 0.0001)
的差异,本质上是浮点数精度限制与数值表示方式的综合结果。以下是详细解释:一、现象分析
根据您的描述和图片信息:
print(8 / 0.0001)
输出80000.0
,符合直觉的整数结果;
print(8 / 0.00001)
却显示为带有小数位的值(如800000.0000000001
)。
这看似矛盾,但根源在于分母的小数精度对运算结果的影响不同。
二、根本原因
1. 浮点数的二进制存储限制
Python 使用 IEEE 754 双精度浮点数(64 位)存储数值,但十进制小数(如
0.0001
和 0.00001
)转换为二进制时可能无法精确表示:
• 0.0001
(十进制的 1e-4
):在二进制中可表示为
1.10011001100110011001101e-1001
,其实际存储值与真实值非常接近,误差极小。
• 0.00001
(十进制的 1e-5
):二进制表示是无限循环小数(类似
1.0100011110101110000101000111101011100001010001111011e-1100
),存储时会被截断或舍入,导致实际存储值略小于真实值。2. 除法运算的误差放大
- 当分母精度较高时(如
0.00001
),存储误差会被放大:
- 当分母误差较小时(如
0.0001
),结果仍能接近精确值:
3. 浮点数的显示规则
Python 会自动简化浮点数的显示:
• 如果结果非常接近整数(如
80000.0
),直接显示为整数形式;
• 如果结果存在显著误差(如 800000.0000000001
),则保留更多小数位以暴露误差。三、验证方法
- 直接查看浮点数的精确值:
- 使用高精度模块
decimal
对比结果:
- 观察误差放大效应:
四、解决方案
- 接受浮点数的固有误差:
理解这是计算机二进制的设计限制,而非代码错误。
- 按需舍入结果:
- 使用高精度计算库:
对精度敏感的场景(如金融计算),使用
decimal
模块:总结
您的观察揭示了浮点数运算的微妙特性:分母的精度误差是否显著,直接影响除法结果的显示形式。
0.00001
的存储误差被放大后导致结果偏离整数,而 0.0001
的误差较小,结果仍能显示为“整洁”的 80000.0
。若需绝对精确,请优先使用 decimal
模块。操作回顾
ALT按住选择多行,然后Ctrl+?按键,不连续行注释


py有内置函数

二、语法回顾
2.1 基本概念与输入输出
2.2 数据类型与索引切片
2.3 运算符与优先级
2.4 条件循环语法和推导式
2.4.1
2.5 函数、封包、解包、命名空间和作用域
2.6 面向对象编程
2.7 错误与异常
2.8 模块与包
- 作者:fntp
- 链接:https://polofox.com/article/py-1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。