第五章 数学运算
5.1 decimal:定点数和浮点数的数学运算
decimal模块实现了定点和浮点算术运算,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模式(即大多数计算机硬件实现的IEEE浮点数运算)。Decimai实例可以准确地表示任何数,对其上或其下取整,还可以限制有效数字个数。
5.1.1 Decimal
小数值被表示为Decimal类的实例。构造函数取一个整数或字符串作为参数。在使用浮点数创建Decimal之前,可以先将浮点数转换为一个字符串,以使调用者能够显式地处理值的位数,因为如果使用硬件浮点数表示则可能无法准确地表述。或者,类方法from_float()可以把一个浮点数转换为精确的小数表示。
import decimal
fmt = '{0:<25} {1:<25}'
print(fmt.format('Input','Output'))
print(fmt.format('-' * 25,'-' * 25))
# Integer
print(fmt.format(5,decimal.Decimal(5)))
# String
print(fmt.format('3.14',decimal.Decimal('3.14')))
# Float
f = 0.1
print(fmt.format(repr(f),decimal.Decimal(str(f))))
print('{:<0.23g} {:<25}'.format(f,str(decimal.Decimal.from_float(f))[:25]))
浮点值0.1并没有被表示为一个精确的二进制值,所以float的表示与Decimal值不同。在这个输出的最后一行,完整的字符串表示被截断为25个字符。
运行结果:
Decimal还可以由元组创建,其中包含一个符号标志(0表示正,1表示负)、由数位组成的一个tuple以及一个整数指数。
import decimal
# Tuple
t = (1,(1,1),-2)
print('Input :',t)
print('Decimal:',decimal.Decimal(t))
基于元组的表示在创建时不太方便,不过它提供了一种可移植的方式,这样可以导出小数值而不损失精度。元组形式可以通过网络传输,或者在不支持精确小数值的数据库中存储,以后再转换回Decimal实例。
运行结果: