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

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

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

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

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

  1. input:
  2. from decimal import *
  3.  
  4. x = Decimal('-3.1415926535') + Decimal('-2.7182818285')
  5. print x
  6. print x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN)
  7. print x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN)
  8. print x.quantize(Decimal('1.0000'), ROUND_CEILING)
  9. print x.quantize(Decimal('1.0000'), ROUND_FLOOR)
  10. print x.quantize(Decimal('1.0000'), ROUND_UP)
  11. print x.quantize(Decimal('1.0000'), ROUND_DOWN)
  12.  
  13. output:
  14. -5.8598744820
  15. -5.8599
  16. -5.8599
  17. -5.8598
  18. -5.8599
  19. -5.8599
  20. -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的数据:

  1. input:
  2. from decimal import *
  3.  
  4. x = Decimal('-3.14159265') + Decimal('-2.7182818285')
  5. print x
  6. print x.quantize(Decimal('1.00000'), ROUND_HALF_EVEN)
  7. print x.quantize(Decimal('1.00000'), ROUND_HALF_DOWN)
  8. print x.quantize(Decimal('1.00000'), ROUND_CEILING)
  9. print x.quantize(Decimal('1.00000'), ROUND_FLOOR)
  10. print x.quantize(Decimal('1.00000'), ROUND_UP)
  11. print x.quantize(Decimal('1.00000'), ROUND_DOWN)
  12.  
  13. output:
  14. -5.8598744785
  15. -5.85987
  16. -5.85987
  17. -5.85987
  18. -5.85988
  19. -5.85988
  20. -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的情况:

  1. input:
  2. y = Decimal('3.1415926535') + Decimal('2.7182818285')
  3. print y
  4. print y.quantize(Decimal('1.0000'), ROUND_HALF_EVEN)
  5. print y.quantize(Decimal('1.0000'), ROUND_HALF_DOWN)
  6. print y.quantize(Decimal('1.0000'), ROUND_CEILING)
  7. print y.quantize(Decimal('1.0000'), ROUND_FLOOR)
  8. print y.quantize(Decimal('1.0000'), ROUND_UP)
  9. print y.quantize(Decimal('1.0000'), ROUND_DOWN)
  10.  
  11. output:
  12. 5.8598744820
  13. 5.8599
  14. 5.8599
  15. 5.8599
  16. 5.8598
  17. 5.8599
  18. 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的情况:

  1. input:
  2. y = Decimal('3.1415926535') + Decimal('2.7182818285')
  3. print y
  4. print y.quantize(Decimal('1.00000'), ROUND_HALF_EVEN)
  5. print y.quantize(Decimal('1.00000'), ROUND_HALF_DOWN)
  6. print y.quantize(Decimal('1.00000'), ROUND_CEILING)
  7. print y.quantize(Decimal('1.00000'), ROUND_FLOOR)
  8. print y.quantize(Decimal('1.00000'), ROUND_UP)
  9. print y.quantize(Decimal('1.00000'), ROUND_DOWN)
  10.  
  11. output:
  12. 5.8598744820
  13. 5.85987
  14. 5.85987
  15. 5.85988
  16. 5.85987
  17. 5.85988
  18. 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

python decimal.quantize()参数rounding的各参数解释与行为的更多相关文章

  1. Python学习笔记五,函数及其参数

    在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容

  2. 2017寒假零基础学习Python系列之函数之 定义默认参数

    在定义函数时,可以有默认参数例如Python自带的函数int(),其实就是两个参数,我们既可以传一个参数,又可以传两个参数 int(') >>>123 int(',8) 83 int ...

  3. python通过getopt模块获取执行命令参数

    python脚本和shell脚本一样可以获取命令行的参数,根据不同的参数,执行不同的逻辑处理. 通常我们可以通过getopt模块获得不同的执行命令和参数. 下面我通过新建一个test.py的脚本解释下 ...

  4. 【Python】 配置解析ConfigParser & 命令行参数解析optparser

    ConfigParser ConfigParser包装了配置文件的读取和写入,使得python程序可以更加轻松操作配置文件了.这里的配置文件是指.ini的那种文件,基本格式如下 [section_a] ...

  5. Python快速学习09: 函数的参数

    前言 系列文章:[传送门] 继续干起来!! 正文 我们已经接触过函数,函数是可以被引用的(访问或者以其他变量作为其别名),也作为参数传入函数,以及作为列表和字典等等容器对象的元素(function)的 ...

  6. Python基础灬函数(定义,参数)

    函数 函数定义 # 定义一个计算绝对值的函数 def cal_abs(x): if x >= 0: return x else: return -x # 调用函数 print('-1的绝对值是: ...

  7. Python学习札记(十二) Function3 函数参数一

    参考:函数参数 Note 1.Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以 ...

  8. python函数中的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

  9. Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数

    Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic ...

随机推荐

  1. (转)Docker磁盘垃圾清理

    文章转自https://mp.weixin.qq.com/s/S8ZjGZF8oLC8c1JRnkE5yw?tdsourcetag=s_pctim_aiomsg 1.整体分析 对于Docker来说,存 ...

  2. Runloop深入理解

    一.什么是Runloop?为什么需要Runloop? Runloop,顾名思义,即运行循环. 没有Runloop的情况下,一个线程执行完一个任务,就会退出并销毁.等到需要处理下一个任务时,再重新创建一 ...

  3. 【Codeforces 331D3】Escaping on Beaveractor

    题意:给\(b\times b\)的网格,其中有\(n\)个不交叉的箭头. 现在有\(q\)个询问,每个询问包含一个点\((x,y)\),以及一个方向\(dir\).时间\(t\). 要求从\((x, ...

  4. sprintf()函数用法

    sprintf()用法见操作手册:http://www.php.net/sprintf 简单写下format的用法: 1. + - 符号,数字 2. 填充字符 默认是空格,可以是0.如果其他字符填充, ...

  5. 字符串阵列String[]转换为整型阵列Int[]

    原始数据: string input = "3,7,2,8,1,9,1,34,67,78,22"; 要处理为: " }; 最终处理为: , , , , , , , , , ...

  6. Qt5.9使用QWebEngineView加载网页速度非常慢,问题解决

    折腾了大半天终于解决了 原帖地址:https://bugreports.qt.io/browse/QTBUG-44763 BUG单下的留言讲明了问题发生的原因,那就是系统默认设置为自动寻找代理,而使用 ...

  7. Python代码转c#部分参考样例

    最近在做一部分Pyhton代码转c#代码的工作,以下案例亲自都测试过,现整理出来希望对有帮助的同学提供参考: Python | C# *:first-child{margin-top:0 !impor ...

  8. Linux系统下CPU使用(load average)梳理

    在平时的运维工作中,当一台服务器的性能出现问题时,通常会去看当前的CPU使用情况,尤其是看下CPU的负载情况(load average).对一般的系统来说,根据cpu数量去判断.比如有2颗cup的机器 ...

  9. linux-shell-引用-命令替换-命令退出状态-逻辑操作符

    命令替换:bash7步扩展的之一 嵌套  这里没什么意义 退出状态可以参与逻辑判断 表达式 算数表达式和条件表达式,逻辑表达式 查看passwd命令比,避免用户捕获输入密码的接口 这种方式就可以直接输 ...

  10. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...