Python 数字处理函数(二)
本篇在Python 数字处理函数(一)的基础上,继续讲解 Python数字处理函数的知识。
二、使用decimal模块实现精确运算
在 Python程序中,模块decimal的功能是实现定点数和浮点数的数学运算。decimal实例可以准确地表示任何数字,对其上取整或下取整,还可以对有效数字个数加以限制。当在程序中需要对小数进行精确计算,不希望因为浮点数天生存在的误差带来影响时,decimal模块便是开发者的最佳选择。例如在下面的实例中,演示了分别实现误差运算和精确运算的过程:
a = 4.2
b = 2.1
print(a + b)
print((a + b) == 6.3)
from decimal import Decimal
a = Decimal ('4.2')
b = Decimal ('2.1')
print(a + b)
print (Decimal('6.3'))
print(a + b)
print((a + b) == Decimal ('6.3'))
from decimal import localcontext
a = Decimal(1.3)
b = Decimal('1.7')
print (a / b)
with localcontext() as ctx:
ctx.prec = 3 #设置3位精度
print(a / b)
with localcontext() as ctx:
ctx.prec = 50 #设置50位精
print(a / b)
前两行展示浮点数是一个尽人皆知的问题:无法精确表达出所有十进制小数位。从原理上讲,这些误差是底层CPU的浮点运算单元和IEEE754浮点数算术标准的一种“特性”。因为Python使用原始表示形式保存浮点数类型保存数据,所以如果在编写代码时用到float实例,那么就无法避免类似的误差。
5~11行使用decimal模块解决浮点数误差,将数字以字符串的形式进行指定。Decimal对象能以任何期望的方式来工作,能够支持所有常见的数学操作。如果要将它们打印出来或在字符串格式化函数中使用,看起来就和普通的数字一样。
12行之后的内容使用decimal模块设置运算数字的小数位数,在实现时需要创建一个本地的上下文环境,然后修改其设定。执行后会输出:
三、处理二进制、八进制和十六进制数据
在Python程序中,当需要对以二进制、八进制或十六进制表示的数值进行转换或输出操作时,通常可以使用内置函数 bin()、oct()和 hex()来实现,这三个函数可以将一个整数转换为二进制、八进制或十六进制的文本字符串形式。如果不想在程序中出现0b、0o或者ox之类的进制前缀符,可以使用format()函数来进行处理。如果需要将字符串形式的整数转换为不同的进制,可以使用函数int()来实现。
例如在下面的实例文件中,演示了将一个整数转换为二进制、八进制或十六进制的过程:
x = 123
print (bin(x))
print (oct(x))
rint(hex(x))
print(format(x, 'b'))
print (format(x, 'o'))
print(format(x, 'x'))
x = -123
print (format(x, 'b'))
print(format(x, 'x'))
x = -123
print (format (2**32 + x,'b'))
print (format(2**32 + x, 'x'))
print(int('4d2', 16))
print (int('10011010010', 2))
第1~4行使用内置函数bin()、 oct() 和hex()实现进制转换。
第5~7行使用函数format()取消进制的前缀。
第8~10行转换处理负整数。
第11~13行添加最大值来设置比特位的长度,这样可以生成个无符号的数值。
最后两行使用函数int()设置进制,将字符串形式的整数转换为不同的进制。
执行后会输出: