python 浮点

 

python IDLE中敲入

>>> 0.1
0.10000000000000001 

>>> round(1.0/3, 2)
0.33000000000000002
>>> round(11.0/3, 2)
3.6699999999999999

    注意所有的编程语言都有这个问题。这是浮点数在计算机中的存储问题。

    考虑十进制是0.125这个小数,其二进制表示为0.001,这两个数是完全等同的。
    但是不是所有的小数都有这样的特性,大多数的小数不能用二进制精确的表示,其结果就是,所有十进制小数在计算机中都是用其最最近似的方式存储表示的。
    考虑分数1/3,可以用十进制近似成0.3,或者0.33,或者0.333。
注:小数部分由十进制转二进制的方法就是一直去掉整数部分,小数部分乘2,直到小数部分为0为止。
如:0.625转为二进制:
0.625*2 = 1.25,  整数部分为1,小数部分为0.25
0.25 * 2 = 0.5 ,  整数部分为0,小数部分为0.5
0.5  * 2 = 1   ,    整数部分为1,小数部分为0
所以0.625转为二进制的结果就是0.101
但是,有些小数,如0.2,再怎么乘2,小数部分也不会得到0的,所以,就有误差了。
 
    因此,考虑小数0.1,它不能用二进制精确的表示,而是表示成了:
0.0001100110011001100110011001100110011001100110011...
  所以你才看到了最开始的情况:
>>> 0.1
0.10000000000000001
  注意当没有使用print时,python解释器使用repr方法获得它需要显示的对象的字符串形式,对浮点数来说,
repr(float)取到小数点后17位;如果使用print,调用的是str方法:
>>> print 0.1
0.1
  使用round方法并不能取得预期效果,是因为0.10000000000000001已经是1/10的最近似的数了,它总是
取最好的结果。
再看一个示例:
>>> sum=0.0
>>> for i in range(10):
 sum+= 0.1
 
>>> sum
0.99999999999999989
  很多的浮点数运算有这样类似的“奇怪”结果。
  解决办法是使用python的decimal模块:
>>> 0.1*0.5
0.050000000000000003
>>> from decimal import *
>>> Decimal("0.1")*Decimal("0.5")
Decimal("0.05")
  这个模块的功能也比较全面和强大。不予详细说明。
<think> 我们正在讨论Python中的浮点型数据。根据用户需求,我们需要详细介绍浮点型数据的定义、使用方法、特性等。 参考站内引用: [^1]: 浮点类型(float)是Python中用于表示实数(包括小数和科学计数法)的数据类型。在Python中,浮点数是一种有限的近似值,用于表示无限的实数集合。可以使用小数或科学计数法表示浮点数。 [^2]: 浮点型就是数学中的小数,如1.1,-0.456等,属于不可迭代对象,是不可变的数据类型。在内存中每个浮点型数据只存在唯一的地址。有两种表示方式。 [^3]: 浮点数支持常见的数学运算,例如加法、减法、乘法和除法,并给出了示例代码。 [^4]: 在需要精确小数计算时,可以使用decimal模块。 根据以上引用和用户需求,我们组织回答如下: 1. 定义:浮点型(float)用于表示实数(小数和科学计数法表示的数),在Python中是一种有限的近似值。 2. 表示方法:小数表示(如3.14, -0.5)和科学计数法(如1.23e5)。 3. 特性:不可变、不可迭代,内存中唯一地址。 4. 数学运算:支持加减乘除等运算,但存在精度问题。 5. 精度问题:由于二进制表示的限制,某些十进制小数无法精确表示(如0.1+0.2!=0.3)。 6. 解决方案:使用decimal模块进行精确计算。 我们将按照以下结构组织回答: 一、浮点型定义与表示 二、浮点型特性 三、浮点型运算 四、浮点型精度问题与解决方案 五、应用场景 六、相关问题 注意:需要引用站内内容的地方要标注引用,如[^1] </think> ### Python 浮点型数据详解 #### 一、定义与表示方式 浮点型(`float`)是 Python 中用于表示**实数**(包含小数和科学计数法)的数据类型[^1]: 1. **小数表示法**: ```python a = 3.14 # 正浮点数 b = -0.005 # 负浮点数 c = 2. # 等同于 2.0 ``` 2. **科学计数法**: ```python d = 1.23e5 # 1.23 × 10⁵ = 123000.0 e = 4.56E-3 # 4.56 × 10⁻&sup3; = 0.00456 ``` > 📌 特点: > - 不可变数据类型(创建后不能修改)[^2] > - 不可迭代对象(不能直接用于循环) > - 内存中每个浮点值有唯一地址 --- #### 二、核心特性 1. **精度限制** 浮点数是**有限精度的近似值**(IEEE 754标准): ```python print(0.1 + 0.2 == 0.3) # 输出 False print(0.1 + 0.2) # 输出 0.30000000000000004 ``` 原因:二进制无法精确表示某些十进制小数(如 0.1)[^1] 2. **数值范围** | 操作 | 返回值示例 | 说明 | |--------------------------------|--------------------|--------------------------| | `sys.float_info.max` | `1.7976931348623157e+308` | 最大可表示正数 | | `sys.float_info.min` | `2.2250738585072014e-308` | 最小可表示正数 | | `float(&#39;inf&#39;)` | `inf` | 正无穷大 | | `float(&#39;-inf&#39;)` | `-inf` | 负无穷大 | --- #### 三、运算与操作 1. **基础算术运算**[^3]: ```python x, y = 3.14, 2.0 print(x + y) # 加法 → 5.14 print(x - y) # 减法 → 1.14 print(x * y) # 乘法 → 6.28 print(x / y) # 除法 → 1.57 print(x ** 2) # 幂运算 → 9.8596 ``` 2. **类型转换**: ```python int(3.7) # 浮点转整数 → 3 (截断小数) float(5) # 整数转浮点 → 5.0 complex(3.1) # 转复数 → (3.1+0j) ``` 3. **精度控制**: ```python print(f"{3.1415926:.2f}") # 保留2位小数 → "3.14" round(2.675, 2) # 四舍五入 → 2.67 (注意银行家舍入规则) ``` --- #### 四、精度问题解决方案 当需要精确小数计算时(如金融系统),使用 `decimal` 模块[^4]: ```python from decimal import Decimal v1 = Decimal(&#39;0.1&#39;) # 必须用字符串初始化 v2 = Decimal(&#39;0.2&#39;) v3 = v1 + v2 # 精确计算 → Decimal(&#39;0.3&#39;) print(float(v3)) # 输出 0.3 ``` > ⚠️ 注意:直接 `Decimal(0.1)` 仍会引入浮点误差! --- #### 五、内存与性能优化 1. **内存占用**: ```python import sys sys.getsizeof(3.14) # 典型占用24字节(64位Python) ``` 2. **高效替代方案**: - 大规模数值计算:用 `numpy.float32`(单精度)或 `numpy.float64`(双精度) - 内存敏感场景:用缩放整数代替(如用分代替元) --- #### 六、应用场景 1. 科学计算(物理公式、统计分析) 2. 金融系统(利率、汇率计算) 3. 数据处理(Pandas/NumPy 数值计算) 4. 图形渲染(3D坐标计算) > 💡 **最佳实践**: > - 常规计算用 `float`,精确计算用 `Decimal` > - 避免用 `==` 直接比较浮点数,改用: > `abs(a - b) < 1e-9` # 设置误差容忍度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值