type
status
date
slug
summary
tags
category
icon
password
Property
May 24, 2025 07:51 AM

Python基础篇

 
一、基础回顾
注意事项,在Python中,除法的结果一定是小数,哪怕整除,结果也一定是小数
notion image
执行这个py文件你会发现,存在打印,这是因为,this中存在函数,在执行当前文件的时候,会自动运行所导入的this,实际上,你import是导入了一个py文件,import的作用就是导入一个模块或者包,一个py文件就可以当作一个模块,因此你实际上引入的是一个单独模块,单独文件,所以执行的时候,是执行了这个文件。
 
任何字段必须先定义后使用
 
有趣的现象:
py中做除法运算,有一个很奇怪的现象,为什么? print(8 / 0.00001)结果是
notion image
print(8 / 0.0001)结果却是:
notion image
这应该是精度的问题
 
解答:
好的,我现在需要帮用户解决为什么在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可能有误差,导致显示更多小数位。
总结可能的原因:
  1. 分母的二进制表示不同:0.0001可能更容易被精确表示为二进制浮点数,而0.00001无法精确表示,导致除法结果的误差。
  1. 结果的大小不同:较大的结果可能接近浮点数的表示极限,导致精度损失。
  1. 打印时的舍入策略:Python自动舍入到一定小数位,但当误差较大时会显示更多小数。
最后,需要向用户解释这些可能性,并提供验证方法,比如使用decimal模块检查精确值,或者查看浮点数的十六进制表示,以确认是否存在精度误差。同时,建议用户在处理需要高精度的计算时使用decimal模块,以避免此类问题。
您在 Python 中观察到的 print(8 / 0.00001)print(8 / 0.0001) 的差异,本质上是浮点数精度限制与数值表示方式的综合结果。以下是详细解释:

一、现象分析

根据您的描述和图片信息:
  1. print(8 / 0.0001) 输出 80000.0,符合直觉的整数结果;
  1. print(8 / 0.00001) 却显示为带有小数位的值(如 800000.0000000001)。
这看似矛盾,但根源在于分母的小数精度对运算结果的影响不同

二、根本原因

1. 浮点数的二进制存储限制

Python 使用 IEEE 754 双精度浮点数(64 位)存储数值,但十进制小数(如 0.00010.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),则保留更多小数位以暴露误差。

三、验证方法

  1. 直接查看浮点数的精确值
    1. 使用高精度模块 decimal 对比结果
      1. 观察误差放大效应

        四、解决方案

        1. 接受浮点数的固有误差
          1. 理解这是计算机二进制的设计限制,而非代码错误。
        1. 按需舍入结果
          1. 使用高精度计算库
            1. 对精度敏感的场景(如金融计算),使用 decimal 模块:

          总结

          您的观察揭示了浮点数运算的微妙特性:分母的精度误差是否显著,直接影响除法结果的显示形式0.00001 的存储误差被放大后导致结果偏离整数,而 0.0001 的误差较小,结果仍能显示为“整洁”的 80000.0。若需绝对精确,请优先使用 decimal 模块。
           
           
           
          操作回顾
           
          ALT按住选择多行,然后Ctrl+?按键,不连续行注释
           
          notion image
          notion image
           
          py有内置函数
           
           
          notion image
           

          二、语法回顾

          2.1 基本概念与输入输出

           

          2.2 数据类型与索引切片

           

          2.3 运算符与优先级

           

          2.4 条件循环语法和推导式

          2.4.1
           

          2.5 函数、封包、解包、命名空间和作用域

           

          2.6 面向对象编程

           

          2.7 错误与异常

           

          2.8 模块与包

           
           
           
           
          SpringBoot3单机Kafka服务Python复习笔记(二):科学计算与常用三方库函数
          Loading...
          fntp
          fntp
          多一点兴趣,少一点功利
          最新发布
          小知识Tip(一):为什么python打印字符串'''...''’可以在前面加一个r?
          2025-6-23
          机器学习基础篇(三):线性回归算法
          2025-6-21
          机器学习基础篇(十一):决策树算法
          2025-6-21
          机器学习基础篇(五):梯度下降
          2025-6-21
          机器学习基础篇(四):数学知识概要
          2025-6-21
          JDK-Tips(一):关于Lambda的巧妙使用
          2025-5-24
          公告
          📝 博客只为了记录我的学习生涯
          😎 我的学习目标是成为一名极客
          🤖 我热爱开源当然我也拥抱开源
          💌 我期待能收到你的Email留言
          📧 我的邮箱:stickpoint@163.com
          欢迎交流~