Python学习:decimal --- 十进制定点和浮点运算

系统 1946 0

decimal 模块为快速正确舍入的十进制浮点运算提供支持。
模块设计以三个概念为中心:十进制数,算术上下文和信号。

  • 十进制数是不可变的。 它有一个符号,系数数字和一个指数。 为了保持重要性,系数数字不会截断尾随零。十进制数也包括特殊值,例如 Infinity ,-Infinity ,和 NaN 。 该标准还区分 -0 和 +0 。

  • 算术的上下文是指定精度、舍入规则、指数限制、指示操作结果的标志以及确定符号是否被视为异常的陷阱启用器的环境。 舍入选项包括 ROUND_CEILING 、 ROUND_DOWN 、 ROUND_FLOOR 、 ROUND_HALF_DOWN, ROUND_HALF_EVEN 、 ROUND_HALF_UP 、 ROUND_UP 以及 ROUND_05UP.

  • 信号是在计算过程中出现的异常条件组。 根据应用程序的需要,信号可能会被忽略,被视为信息,或被视为异常。 十进制模块中的信号有:Clamped 、 InvalidOperation 、 DivisionByZero 、 Inexact 、 Rounded 、 Subnormal 、 Overflow 、 Underflow 以及 FloatOperation 。

  • 对于每个信号,都有一个标志和一个陷阱启动器。 遇到信号时,其标志设置为 1 ,然后,如果陷阱启用器设置为 1 ,则引发异常。 标志是粘性的,因此用户需要在监控计算之前重置它们。

快速入门教程

通常使用小数的开始是导入模块,使用 getcontext() 查看当前上下文,并在必要时为精度、舍入或启用的陷阱设置新值:

            
              
                >>
              
              
                >
              
              
                from
              
               decimal 
              
                import
              
              
                *
              
              
                >>
              
              
                >
              
               getcontext
              
                (
              
              
                )
              
              
Context
              
                (
              
              prec
              
                =
              
              
                28
              
              
                ,
              
               rounding
              
                =
              
              ROUND_HALF_EVEN
              
                ,
              
               Emin
              
                =
              
              
                -
              
              
                999999
              
              
                ,
              
               Emax
              
                =
              
              
                999999
              
              
                ,
              
              
        capitals
              
                =
              
              
                1
              
              
                ,
              
               clamp
              
                =
              
              
                0
              
              
                ,
              
               flags
              
                =
              
              
                [
              
              
                ]
              
              
                ,
              
               traps
              
                =
              
              
                [
              
              Overflow
              
                ,
              
               DivisionByZero
              
                ,
              
              
        InvalidOperation
              
                ]
              
              
                )
              
              
                >>
              
              
                >
              
               getcontext
              
                (
              
              
                )
              
              
                .
              
              prec 
              
                =
              
              
                7
              
              
                # Set a new precision
              
            
          

可以从整数、字符串、浮点数或元组构造十进制实例。 从整数或浮点构造将执行该整数或浮点值的精确转换。 十进制数包括特殊值,例如 NaN 代表“非数字”,正的和负的 Infinity,和 -0

            
              
                >>
              
              
                >
              
               getcontext
              
                (
              
              
                )
              
              
                .
              
              prec 
              
                =
              
              
                28
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                10
              
              
                )
              
              
Decimal
              
                (
              
              
                '10'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '3.14'
              
              
                )
              
              
Decimal
              
                (
              
              
                '3.14'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                3.14
              
              
                )
              
              
Decimal
              
                (
              
              
                '3.140000000000000124344978758017532527446746826171875'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                (
              
              
                0
              
              
                ,
              
              
                (
              
              
                3
              
              
                ,
              
              
                1
              
              
                ,
              
              
                4
              
              
                )
              
              
                ,
              
              
                -
              
              
                2
              
              
                )
              
              
                )
              
              
Decimal
              
                (
              
              
                '3.14'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                str
              
              
                (
              
              
                2.0
              
              
                **
              
              
                0.5
              
              
                )
              
              
                )
              
              
Decimal
              
                (
              
              
                '1.4142135623730951'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                2
              
              
                )
              
              
                **
              
               Decimal
              
                (
              
              
                '0.5'
              
              
                )
              
              
Decimal
              
                (
              
              
                '1.414213562373095048801688724'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                'NaN'
              
              
                )
              
              
Decimal
              
                (
              
              
                'NaN'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '-Infinity'
              
              
                )
              
              
Decimal
              
                (
              
              
                '-Infinity'
              
              
                )
              
            
          

新 Decimal 的重要性仅由输入的位数决定。 上下文精度和舍入仅在算术运算期间发挥作用。

            
              
                >>
              
              
                >
              
               getcontext
              
                (
              
              
                )
              
              
                .
              
              prec 
              
                =
              
              
                6
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '3.0'
              
              
                )
              
              
Decimal
              
                (
              
              
                '3.0'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '3.1415926535'
              
              
                )
              
              
Decimal
              
                (
              
              
                '3.1415926535'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '3.1415926535'
              
              
                )
              
              
                +
              
               Decimal
              
                (
              
              
                '2.7182818285'
              
              
                )
              
              
Decimal
              
                (
              
              
                '5.85987'
              
              
                )
              
              
                >>
              
              
                >
              
               getcontext
              
                (
              
              
                )
              
              
                .
              
              rounding 
              
                =
              
               ROUND_UP

              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '3.1415926535'
              
              
                )
              
              
                +
              
               Decimal
              
                (
              
              
                '2.7182818285'
              
              
                )
              
              
Decimal
              
                (
              
              
                '5.85988'
              
              
                )
              
            
          

Decimal 也可以使用一些数学函数

            
              
                >>
              
              
                >
              
               getcontext
              
                (
              
              
                )
              
              
                .
              
              prec 
              
                =
              
              
                28
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                2
              
              
                )
              
              
                .
              
              sqrt
              
                (
              
              
                )
              
              
Decimal
              
                (
              
              
                '1.414213562373095048801688724'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                1
              
              
                )
              
              
                .
              
              exp
              
                (
              
              
                )
              
              
Decimal
              
                (
              
              
                '2.718281828459045235360287471'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '10'
              
              
                )
              
              
                .
              
              ln
              
                (
              
              
                )
              
              
Decimal
              
                (
              
              
                '2.302585092994045684017991455'
              
              
                )
              
              
                >>
              
              
                >
              
               Decimal
              
                (
              
              
                '10'
              
              
                )
              
              
                .
              
              log10
              
                (
              
              
                )
              
              
Decimal
              
                (
              
              
                '1'
              
              
                )
              
            
          

设定有效数字的方法

            
              
                from
              
               decimal 
              
                import
              
              
                *
              
              
getcontext
              
                (
              
              
                )
              
              
                .
              
              prec 
              
                =
              
              
                6
              
              
Decimal
              
                (
              
              
                1
              
              
                )
              
              
                /
              
              Decimal
              
                (
              
              
                7
              
              
                )
              
              
                # 结果为Decimal('0.142857'),六个有效数字
              
            
          

quantize() 方法

quantize() 方法将数字四舍五入为固定指数。 此方法对于 将结果舍入到固定的位置 的货币应用程序非常有用:

            
              bb
              
                =
              
              decimal
              
                .
              
              Decimal
              
                (
              
              
                '7.325'
              
              
                )
              
              
                .
              
              quantize
              
                (
              
              decimal
              
                .
              
              Decimal
              
                (
              
              
                '.01'
              
              
                )
              
              
                ,
              
               decimal
              
                .
              
              ROUND_UP
              
                )
              
              
                print
              
              
                (
              
              bb
              
                )
              
              
b
              
                =
              
              decimal
              
                .
              
              Decimal
              
                (
              
              
                '7.325'
              
              
                )
              
              
                .
              
              quantize
              
                (
              
              decimal
              
                .
              
              Decimal
              
                (
              
              
                '.01'
              
              
                )
              
              
                ,
              
               decimal
              
                .
              
              ROUND_DOWN
              
                )
              
              
                print
              
              
                (
              
              b
              
                )
              
            
          
            
              输出:
7.33
7.32

            
          

Rounding modes

  • decimal.ROUND_CEILING
    Round towards Infinity.

  • decimal.ROUND_DOWN
    Round towards zero.

  • decimal.ROUND_FLOOR
    Round towards -Infinity.

  • decimal.ROUND_HALF_DOWN
    Round to nearest with ties going towards zero.

  • decimal.ROUND_HALF_EVEN
    Round to nearest with ties going to nearest even integer.

  • decimal.ROUND_HALF_UP
    Round to nearest with ties going away from zero.

  • decimal.ROUND_UP
    Round away from zero.

  • decimal.ROUND_05UP
    Round away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise round towards zero.

Context objects

decimal.getcontext()
Return the current context for the active thread.

decimal.setcontext(c)
Set the current context for the active thread to c.


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论