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
python decimal.quantize()参数rounding的各参数解释与行为的更多相关文章
- Python学习笔记五,函数及其参数
在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容
- 2017寒假零基础学习Python系列之函数之 定义默认参数
在定义函数时,可以有默认参数例如Python自带的函数int(),其实就是两个参数,我们既可以传一个参数,又可以传两个参数 int(') >>>123 int(',8) 83 int ...
- python通过getopt模块获取执行命令参数
python脚本和shell脚本一样可以获取命令行的参数,根据不同的参数,执行不同的逻辑处理. 通常我们可以通过getopt模块获得不同的执行命令和参数. 下面我通过新建一个test.py的脚本解释下 ...
- 【Python】 配置解析ConfigParser & 命令行参数解析optparser
ConfigParser ConfigParser包装了配置文件的读取和写入,使得python程序可以更加轻松操作配置文件了.这里的配置文件是指.ini的那种文件,基本格式如下 [section_a] ...
- Python快速学习09: 函数的参数
前言 系列文章:[传送门] 继续干起来!! 正文 我们已经接触过函数,函数是可以被引用的(访问或者以其他变量作为其别名),也作为参数传入函数,以及作为列表和字典等等容器对象的元素(function)的 ...
- Python基础灬函数(定义,参数)
函数 函数定义 # 定义一个计算绝对值的函数 def cal_abs(x): if x >= 0: return x else: return -x # 调用函数 print('-1的绝对值是: ...
- Python学习札记(十二) Function3 函数参数一
参考:函数参数 Note 1.Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以 ...
- python函数中的位置参数、默认参数、关键字参数、可变参数区别
一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...
- Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数
Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic ...
随机推荐
- stm32cubemx学习要点记录
如果有些外设的HAL库函数找不到的话,你可以到IAR工程的文件夹显示栏中找如下图所示:
- kubernetes集群中对多个pod操作命令
$ for i in 0 1; do kubectl exec web-$i -- sh -c 'echo hello $(hostname) > /usr/share/nginx/html/i ...
- tiled卷积神经网络(tiled CNN)
这个结构是10年Quoc V.Le等人提出的,这里的tiled,按照 Lecun的解释是Locally-connect non shared.即是局部连接,而且不是共享的,这是针对于权重来说的.本文翻 ...
- MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)
惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...
- HNOI2014做题笔记
HNOI2014 世界树(虚树.倍增) \(\sum M \leq 3 \times 10^5\)虚树没得跑 对于所有重要点和它们的\(LCA\)建立虚树,然后计算出每一个虚树上的点被哪个重要点控制. ...
- python 的zip 函数小例子
In [57]: name = ('Tome','Rick','Stephon') In [58]: age = (45,23,55) In [59]: for a,n in zip (name,ag ...
- Caffe源码中math_functions文件分析
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1. include文件: ...
- nodejs-日志组件log4js的使用方法
log4js是在nodejs一个非常好用的日志组件,但是今天在使用的时候从网上查看的代码并不能运行(http://www.cnblogs.com/atp-sir/p/7070050.html),于是查 ...
- Http指南(1)
网关:是一种特殊的服务器,作为其他服务器的中间实体使用; Agent代理:所有发布web请求的应用程序都是HTTP Agent代理.Web浏览器其实就是一种代理; HTTP报文是在HTTP应用程序之间 ...
- C#_XML与Object转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...