强基初中数学&学Python——第208课 数字和数学模块之三:decimal模块(1)——快速入门

  decimal模块介绍

  decimal模块提供快速十进制精确小数的运算。与float数据类型相比,它具有以下几个优点:  (1)与我们心中的十进制小数概念相同;  (2)数字是完全精确的;  (3)算术运算(加减乘除)操作过程中的数也是精确的;  (4)包含有效位的概念,不自动去除小数中后面的0;  (5)可更改精度(默认是28位),与问题所需的精度一致;  (6)公开所有必要的接口,这样程序员可以通过舍入和信号处理达到所需的要求,这包括通过异常处理避免不精确的运算,从而得到精确的结果;  (7)提供无偏差无舍入的十进制算术运算(也称为定点数算术)和有舍入的浮点数算术。  该模块以三个概念为中心:Decimal精确小数对象,算术上下文对象和信号。  decimal数值是不可变对象(可作为字典的键)。它由符号,系数和指数位组成。为了保持有效位,系数位不会截去末尾零。decimal数值也包括特殊值例如 Infinity ,-Infinity 和 NaN 。还区分 -0 和 +0 。  算术上下文是指定精度、舍入规则、指数限制等。   信号是在计算过程中出现的一组异常状况。根据应用程序的需要,信号可能会被忽略、被视为信息或异常。   对于每个信号,都关联一个标志和一个陷阱。遇到信号时,其标志设置为1 ,然后,如果陷阱设置为1 ,则引发异常。标志像告事贴,因此用户需要在监控计算之前重置它们。  快速入门教程  通常使用decimal的方式是先导入该模块,可以通过getcontext()查看当前上下文,如有必要时为精度、舍入方式或陷阱设置为新值:  可以通过整数、字符串、浮点数或元组构造Decimal对象。 通过整数或浮点数构造时,会把该整数或浮点数的值转换精确。Decimal对象(精确数)包括特殊值例如 NaN 表示“非数字”,正的和负的Infinity和-0。  如果FloatOperation陷阱被设置为抛出状态(True),构造函数中的参数是浮点数、精确小数(Decimal)和浮点数混合排序比较(>,<,>=,<=)会引发异常。
  Decimal的精确性仅由输入的位数决定,而上下文中的精度和舍入设置仅在算术运算期间发挥作用。
  构造一个Decimal时,即使超出了Emax的限制,也不会抛出异常,但运行结果超出Emax的限制会抛出Overflow异常;但如果超出了运行层(C语言)版本的内部限制,也会引发InvalidOperation。
  Decimal能够像浮点数一样使用,数字的操作符和内置函数一样可以用于Decimal。下面是一个分币制数列表的有关运算:
注:map(Decimal, strList)使strList的每一项都进行Decimal()运算,转化为一个序列,再通过list()转为列表。
  Decimal内部也有一些数学方法可以使用:
  Decimal的quantize()方法可以不改变上下文的精度,将数字舍入为小数点后固定位数。此方法对于将结果舍入到固定的位置的货币应用程序非常有用:
  从上面所述中得到,getcontext()函数访问当前上下文并允许更改设置。 这种方法满足大多数应用程序的需求。对于更加特殊的计算,就需要使用Context()构造函数创建合适的上下文对象, 并使用setcontext()函数设置上下文。默认情况下,decimal模块提供了两个现成的上下文BasicContext和 ExtendedContext对象。 前者对调试特别有用,因为许多陷阱已被启用:
  上下文还具有用于监视计算期间遇到的异常情况的信号标志。标志不会自动清除,保持直到显式清除,因此最好通过使用clear_flags()方法清除每组受监控计算之前的标志。flags条目显示对π的有理逼近被舍入(超出上下文精度的数字被抛弃),所以结果是不精确的(一些丢弃的数字不为零)。

  使用上下文对象的traps字段(字典)设置单个陷阱:
  大多数程序只在程序开始时调整当前上下文一次。而且,在许多应用程序中,数据被一次性转换为精确小数(Decimal),就算在循环中也一样。创建了上下文和精确小数后,大部分Python程序操作精确小数与其他数字类型就没有什么不同了。