目录
一、小数与浮点数
二、小数精度自动升级
三、设置全局精度(高精度)
3.1 什么是精度
3.2 设置高精度(超过17位的精度)
在python中小数是通过导入一个模块调用函数后创建的,而不是通过运行常量表达式创建的(运行常量表达式创建的是浮点型)。从功能上来说小数对象就是浮点数,只不过它们有固定的位数和小数点,因此小数是有固定精度的浮点值。
浮点数缺乏精确性,因为用来存储数值的空间有限。例如:下面的计算应该得到0,但是却没有,结果接近零,但是却没有足够的位数去实现这样的精度。因为与硬件相关的浮点数运算在精度方面存在缺陷。
a=0.1+0.1+0.1-0.3
print(a)
输出为 5.551115123125783e-17
不过使用小数却可以改变这一缺陷,:
from decimal import Decimal
c=Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')
print(c) #0.0
当有不同精度的小数在表达式中混编时,python自动升级为小数位数最多的:
from decimal import Decimal
c=Decimal('0.1')+Decimal('0.01')+Decimal('0.05')-Decimal('0.0093')
print(c) #0.1507,自动升级为四位小数
浮点数是用机器上浮点数的本机双精度(64 bit)表示的。提供大约17位的精度和范围从-308到308的指数。和C语言里面的double类型相同。Python不支持32bit的单精度浮点数。如果程序需要精确控制区间和数字精度,可以考虑使用numpy扩展库。
Python 3.X对于浮点数默认的是提供17位数字的精度。
关于单精度和双精度的通俗解释:
单精度型和双精度型,其类型说明符为float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
使用decimal模块中的getcontext()函数,先看一下这个函数:
import decimal
print(decimal.getcontext())
输出为:
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
从输出结果中可以看出默认的精度是28位,但是可以设置为更高。这样在分析复杂的浮点数的时候,可以有更高的自己可以控制的精度。其实可以留意下context里面的这rounding=ROUND_HALF_EVEN 参数。ROUND_HALF_EVEN, 当half的时候,靠近even.
import decimal
print(decimal.Decimal(1)/decimal.Decimal(7)) #0.1428571428571428571428571429
decimal.getcontext().prec=4
print(decimal.Decimal(1)/decimal.Decimal(7)) #0.1429
c=Decimal('0.1')+Decimal('0.01')+Decimal('0.05')-Decimal('0.00593')
print(c) #0.1541
也可以处理50位精度的小数:
import decimal
print(decimal.Decimal(1)/decimal.Decimal(7)) #0.1428571428571428571428571429
decimal.getcontext().prec=50
print(decimal.Decimal(1)/decimal.Decimal(7))
输出为:
0.14285714285714285714285714285714285714285714285714