zoukankan      html  css  js  c++  java
  • python decimal.quantize()参数rounding的各参数解释与行为

    我最开始其实是由于疑惑ROUND_FLOOR和 ROUND_DOWN的表现区别才看了一波文档,但是感觉拉出一票以前没有留意过的东西。

    贴一个decimal文档里面的解释:

    ROUND_CEILING (towards Infinity),
    ROUND_DOWN (towards zero),
    ROUND_FLOOR (towards -Infinity),
    ROUND_HALF_DOWN (to nearest with ties going towards zero),
    ROUND_HALF_EVEN (to nearest with ties going to nearest even integer),
    ROUND_HALF_UP (to nearest with ties going away from zero), or
    ROUND_UP (away from zero).
    ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)

    直接阅读上面的解释十分抽象,下面我结合例子来解释一下在正负数不同的情况下 他们究竟有着什么样的行为

    首先给出一组负数的后一位超过5的数据:

    input:
    from decimal import *
    
    x = Decimal('-3.1415926535') + Decimal('-2.7182818285')
    print x
    print x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN)
    print x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN)
    print x.quantize(Decimal('1.0000'), ROUND_CEILING)
    print x.quantize(Decimal('1.0000'), ROUND_FLOOR)
    print x.quantize(Decimal('1.0000'), ROUND_UP)
    print x.quantize(Decimal('1.0000'), ROUND_DOWN)
    
    output:
    -5.8598744820
    -5.8599
    -5.8599
    -5.8598
    -5.8599
    -5.8599
    -5.8598

    ROUND_HALF_EVENT 和 ROUND_HALF_DOWN:EVENT是quansize的默认设置值,可以通过getcontext()得到,EVENT四舍五入进了一位,DOWN为接近最近的0进了一位。

    ROUND_CEILING 和 ROUND_FLOOR:CEILING超过5没有进位是因为它倾向正无穷,FLOOR为了总是变得更小所以进了一位。

    ROUND_UP 和 ROUND_DOWN:UP始终进位,DOWN始终不会进位。。

    再多对比一组后一位没有超过5的数据:

    input:
    from decimal import *
    
    x = Decimal('-3.14159265') + Decimal('-2.7182818285')
    print x
    print x.quantize(Decimal('1.00000'), ROUND_HALF_EVEN)
    print x.quantize(Decimal('1.00000'), ROUND_HALF_DOWN)
    print x.quantize(Decimal('1.00000'), ROUND_CEILING)
    print x.quantize(Decimal('1.00000'), ROUND_FLOOR)
    print x.quantize(Decimal('1.00000'), ROUND_UP)
    print x.quantize(Decimal('1.00000'), ROUND_DOWN)
    
    output:
    -5.8598744785
    -5.85987
    -5.85987
    -5.85987
    -5.85988
    -5.85988
    -5.85987

    ROUND_HALF_EVENT 和 ROUND_HALF_DOWN:EVENT是quansize的默认设置值,可以通过getcontext()得到,EVENT由于达不到四舍五入所以不进位,DOWN同样也不进位。

    ROUND_CEILING 和 ROUND_FLOOR:CEILING倾向正无穷不进位,FLOOR即使没有超过5,但是为了总是变得更小进了一位。

    ROUND_UP 和 ROUND_DOWN:UP始终进位,DOWN始终不会进位。。

    正数部分后面数大于5的情况:

    input:
    y = Decimal('3.1415926535') + Decimal('2.7182818285')
    print y
    print y.quantize(Decimal('1.0000'), ROUND_HALF_EVEN)
    print y.quantize(Decimal('1.0000'), ROUND_HALF_DOWN)
    print y.quantize(Decimal('1.0000'), ROUND_CEILING)
    print y.quantize(Decimal('1.0000'), ROUND_FLOOR)
    print y.quantize(Decimal('1.0000'), ROUND_UP)
    print y.quantize(Decimal('1.0000'), ROUND_DOWN)
    
    output:
    5.8598744820
    5.8599
    5.8599
    5.8599
    5.8598
    5.8599
    5.8598

    ROUND_HALF_EVENT 和 ROUND_HALF_DOWN:EVENT是quansize的默认设置值,可以通过getcontext()得到,EVENT由于达到四舍五入所以进位,DOWN同样进位。

    ROUND_CEILING 和 ROUND_FLOOR:CEILING正数始终进位,FLOOR在正数则始终不会进位。

    ROUND_UP 和 ROUND_DOWN:UP始终进位,DOWN始终不会进位。

    正数部分后面数小于5的情况:

    input:
    y = Decimal('3.1415926535') + Decimal('2.7182818285')
    print y
    print y.quantize(Decimal('1.00000'), ROUND_HALF_EVEN)
    print y.quantize(Decimal('1.00000'), ROUND_HALF_DOWN)
    print y.quantize(Decimal('1.00000'), ROUND_CEILING)
    print y.quantize(Decimal('1.00000'), ROUND_FLOOR)
    print y.quantize(Decimal('1.00000'), ROUND_UP)
    print y.quantize(Decimal('1.00000'), ROUND_DOWN)
    
    output:
    5.8598744820
    5.85987
    5.85987
    5.85988
    5.85987
    5.85988
    5.85987

    ROUND_HALF_EVENT 和 ROUND_HALF_DOWN:EVENT是quansize的默认设置值,可以通过getcontext()得到,EVENT由于没有达到四舍五入所以不进位,DOWN同样不进位。

    ROUND_CEILING 和 ROUND_FLOOR:CEILING正数始终进位,FLOOR在正数则始终不会进位。

    ROUND_UP 和 ROUND_DOWN:UP始终进位,DOWN始终不会进位。

    总结:

    其实这里我们通过上面一组例子可以发现,正数的行为非常可预期也非常简单,负数的情况稍复杂,有些函数就是设计为负数在某些情况中使用的。正数中无法重现的ROUND_DOWN和ROUND_FLOOR的区别,ROUND_DOWN是无论后面是否大于5都不会管保持原状,而Floor在正数中的行为也是如此,但是在负数中为了倾向无穷小,所以无论是否大于5,他都会变得更小而进位。反而ROUND_UP和ROUND_DOWN的行为是最可预期的,那就是无论后面数大小,UP就进位,DOWN就始终不进位。

    Reference:

    https://docs.python.org/2/library/decimal.html#decimal.getcontext    decimal官方文档2.7.11

  • 相关阅读:
    分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector
    关于i++与++i的学习讨论!
    vector 中需要注意的东西!
    c++中 函数的默认参数 学习
    为什么 c++中函数模板和类模板的 声明与定义需要放到一起?
    c++中赋值运算符重载为什么要用引用做返回值?
    为什么const对象只能调用const成员函数,而不能调用非const成员函数?
    java 文件读写
    java Vector
    getRequestDispatcher
  • 原文地址:https://www.cnblogs.com/piperck/p/5843253.html
Copyright © 2011-2022 走看看