简介
如果你从事科学或工程领域的大多数计算,那么使用普通的浮点类型是比较普遍的做法。因为在真实世界中很少会要求精确到17位精度的普通浮点数。因此,计算过程中的那么一点点的误差是被允许的。其次,原生的二进制浮点数计算要快的多-有时候你在执行大量运算的时候速度也是非常重要的。总的来说,decimal 模块主要用在涉及到金融的领域。在这类程序中,哪怕是一点小小的误差在计算过程中蔓延都是不允许的。因此,decimal 模块为解决这类精度问题提供了方法。decimal意思为十进制,这个模块提供了十进制浮点运算支持。我们在数据库处理金融数据的时候也会遇到 Decimal 对象。
问题
当你在编写科学计算或者金融程序的时候碰到这种情况会让人发狂:
>>>a = 4.2
>>>b = 2.1
>>>a + b
6.300000000000001
1
2
3
4
>>>a=4.2
>>>b=2.1
>>>a+b
6.300000000000001
这就是机器进行二进制计算引入的误差,为了消除这样的误差,进行更加精确的浮点计算,就要是用到decimal模块。
Decimal()函数
from decimal import *
1
fromdecimalimport*
我们直接导入decimal模块里的所有函数。现在我们可以通过Decimal函数构建十进制浮点数,并进行常规的数值计算。
>>>a = Decimal('4.2')
>>>b = Decimal('2.1')
>>>a + b
Decimal('6.3')
>>>x = Decimal(3)
>>>y = Decimal(1)
>>>x + y
Decimal('4')
1
2
3
4
5
6
7
8
9
>>>a=Decimal('4.2')
>>>b=Decimal('2.1')
>>>a+b
Decimal('6.3')
>>>x=Decimal(3)
>>>y=Decimal(1)
>>>x+y
Decimal('4')
注意,Decimal函数传入的浮点数必须加引号(”),表示成字符串形式。传入整数时就不用加。Decimal函数的对象类型是decimal.Decimal,可以通过type()函数查看。
浮点数据转换成Decimal
Decimal函数并不建议传入浮点型数据,因为浮点型数据本身就是不精确的。可以通过两种方式传入浮点型数据:
>>>Decimal(1.22)
Decimal('1.2199999999999999733546474089962430298328399658203125')
>>>Decimal.from_float(15.3333)
Decimal('15.3332999999999994855670593096874654293060302734375')
1
2
3
4
5
>>>Decimal(1.22)
Decimal('1.2199999999999999733546474089962430298328399658203125')
>>>Decimal.from_float(15.3333)
Decimal('15.3332999999999994855670593096874654293060302734375')
getcontext().prec 设定有效数字
>>>getcontext().prec = 4
>>>Decimal('2.2') / Decimal('1.3')
Decimal('1.692')
1
2
3
>>>getcontext().prec=4
>>>Decimal('2.2')/Decimal('1.3')
Decimal('1.692')
保留4位有效数字。
设定小数位数
>>>Decimal('1.2346568355').quantize(Decimal('0.00'))
Decimal('1.23')
1
2
>>>Decimal('1.2346568355').quantize(Decimal('0.00'))
Decimal('1.23')
保留两位小数。
转换成字符串(string)格式
直接调用str()函数:
>>>str(Decimal('1.2346568355').quantize(Decimal('0.00')))
'1.23'
1
2
>>>str(Decimal('1.2346568355').quantize(Decimal('0.00')))
'1.23'