python中的小数精度及浮点数计数原理

本文详细解析了Python中处理小数的多种方法,包括round()函数的特殊规则、字符串格式化技巧以及decimal模块的高精度计算,适用于各种精度需求。

round()内置方法
输入参数第一位为输入的数值,第二位为小数点后保存位数,不填默认为保留小数点后一位且取整

>>> round(2.5) 
3.0
>>> round(-2.5) 
-3.0
>>>> round(2.675) 
3.0
>>>> round(2.675,2) 
2.67 

不过round()有个坑
round()如果只有一个数作为参数,不指定位数的时候,返回的是一个整数,而且是最靠近的整数。一般情况是使用四舍五入的规则,但是碰到舍入的后一位为5的情况,如果要取舍的位数前的数是偶数,则直接舍弃,如果奇数会向上取舍。看下面的示例(就是这么神奇):

>>> round(2.555,2) 
 2.56
 >>>> round(2.565,2) 
 2.56
 >>>> round(2.575,2) 
 2.58
 >>>> round(2.585,2) 
 2.58 

使用格式化

print("付款金额为:{:.2f}".format(2.435))
付款金额为:2.44
print("付款金额为:{:.2f}".format(2.434))
付款金额为:2.43
print("付款金额为:{:.2f}".format(2.445))
付款金额为:2.44
print("付款金额为:{:.2f}".format(2.444))
付款金额为:2.44

使用:.2f,来表示小数,其中数字可以改为任意数字,对应保留为相应位数的小数点。同时和round()一般情况是使用四舍五入的规则,但是碰到舍入的后一位为5的情况,如果要取舍的位数前的数是偶数,则直接舍弃,如果奇数会向上取舍
这里还有个小tips如果不加数字前的’.’,那么不管数字是多少所有的都会默认保留小数点后6位

print("付款金额为:{:3f}".format(2.435))
付款金额为:2.435000

高精度使用decimal模块,配合getcontext

#该方法最好用于计算

```python
from decimal import Decimal, getcontext
getcontext().prec = 3
price = Decimal(1.12345)
print(price)
1.1234500000000000596855898038484156131744384765625
weight = Decimal(1.12345)
print(weight)
1.1234500000000000596855898038484156131744384765625
result = Decimal(price * weight)
print("付款金额为:{}".format(result))
付款金额为:1.26

这里简单解释下为什么小数会变成那么大一串数字。
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。
getcontext().prec方法控制小数点位置,四舍五入
这里有个坑需要注意的是getcontext().prec对于数值较大的运算,可以设置的适中,如9不然最后出现的值,可能无法正常显示

除法

a = 1
b = 3
print(a / b)
0.3333333333333333

刚刚简单提过,是的,python中的除法是精确运算,结果为float小数,最大精度为python默认位数,小数点后16位

以上就是常用的几种方法,其他其实还有math模块里的方法啥的,不是常用的就不介绍了

### 三、Python 中单精度浮点数与双精度浮点数的区别 在 Python 中,浮点数默认使用的是双精度(`float` 类型),它基于 IEEE 754 标准实现,具有更高的精度和更大的数值范围。而单精度浮点数通常在 Python 中并不直接支持,但在某些数值计算库(如 NumPy)中提供了专门的数据类型(如 `numpy.float32`)来处理。 #### 三、一、数据精度与表示方式 单精度浮点数占用 **4 字节**(32 位),其中符号位 1 位、阶码 8 位、尾数 23 位,能够表示大约 7 位有效数字。而双精度浮点数占用 **8 字节**(64 位),包含 1 位符号、11 位阶码和 52 位尾数,能够表示大约 15 位有效数字。因此,双精度浮点数在表示小数时更加精确,适用于科学计算和金融建模等对精度要求较高的场景[^1]。 #### 三、二、内存占用与性能影响 由于单精度浮点数占用的内存更少,因此在处理大规模数据集时可以节省内存空间并提升计算效率。然而,Python 原生的 `float` 类型始终是双精度形式,若需使用单精度浮点数,必须借助如 NumPy 等第三方库来实现。例如: ```python import numpy as np # 单精度浮点数示例 a = np.float32(1.0) print(a.itemsize) # 输出: 4 # 双精度浮点数示例 b = np.float64(1.0) print(b.itemsize) # 输出: 8 ``` #### 三、三、转换与精度丢失问题 在浮点数之间进行转换时,例如将双精度转换为单精度,可能会导致精度丢失。这种精度丢失是由于单精度浮点数无法完整表示双精度浮点数的所有信息,特别是在处理小数部分时可能出现舍入误差。IEEE 754 标准规定了浮点数的转换方式,但在实际操作中仍需谨慎处理,尤其是在比较浮点数是否相等时,应避免使用 `==` 操作符,而是采用误差容忍的方式进行判断[^3]。 ```python import numpy as np # 双精度转单精度 value = np.float64(0.1) single_value = np.float32(value) print(f"Original: {value}, Single: {single_value}") # 输出: Original: 0.1, Single: 0.10000000149011612 ``` #### 三、四、Python 中的底层实现与扩展支持 Python 原生的浮点数类型基于 C 语言的 `double` 实现,即双精度浮点数Python 的灵活性是以牺牲一定的性能为代价的,因为每个浮点数对象都包含类型信息、引用计数等元数据。相比之下,NumPy 提供了更高效的固定类型数组,支持单精度(`float32`)和双精度(`float64`)等种数据类型,适用于大规模数值计算任务[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值