python 小数

目录

一、小数与浮点数

二、小数精度自动升级

三、设置全局精度(高精度)

  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,自动升级为四位小数

三、设置全局精度(高精度)

  3.1 什么是精度

浮点数是用机器上浮点数的本机双精度(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位有效数字。

  3.2 设置高精度(超过17位的精度)

使用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

 

你可能感兴趣的:(Python)