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