python计算四舍五⼊_Python实现⼩数四舍五⼊的⽅法
对⼩数在Python中实现四舍五⼊的⽅法,不能使⽤round函数,round函数的执⾏的是HALF EVEN,不是四舍五⼊(HALF UP)。⽽使⽤decimal模块提供的接⼝,就可以精确实现⼗进制⼩数的四舍五⼊。本⽂对这个topic进⾏详细介绍。
四舍五入函数保留整数Python的浮点数
说到⼩数,程序员的第⼀反应可能就是想到了浮点数,⼩数和浮点数是两个概念。Python中的浮点数,float对象,对应的是机器底层的双精度浮点数。这意味着,float对象的值,并不是⼀个精确的值!⽐如:
>>> 0.1 + 0.1 + 0.1 == 0.3
False
>>> 0.1 + 0.2
0.30000000000000004
所以,对于float对象的数值⽐较操作,要格外⼩⼼,原则上浮点数是不能使⽤ == 来判断的。
浮点数是⼀个计算机底层概念,它就是代表不精确的⼩数,因为计算机有表⽰数据⽅⾯的硬件限制(参考:IEEE754浮点数)。⽽我们⽇常说的⼩数,就是带⼩数点的数。每⼀个⼩数,在计算机中,都有⼀个近似的浮点数的表⽰!
round函数执⾏银⾏家舍⼊法(HALF EVEN)
round是⼀个Python的标准内置函数,round在英⽂⾥,就是对某个数进⾏舍⼊截取的意思,⽽舍⼊截取的⽅式有很多,四舍五⼊只是其中⼀种。从Python官⽅⽂档的说明中,我们可以知道,round函数执⾏的是HALF EVEN,⽽不是四舍五⼊(HALF UP)。
先看⼏个round函数的整数结果测试⽤例:
>>> >>> round(-0.5)
>>> round(0.5)
>>> round(2.5)
2
>>> round(1.5)
2
HALF EVEN的含义,就是在对⼀个数进⾏round的时候,如果这个数与两边的数距离相等,就选择偶数。就是上⾯的例⼦,对0.5取
整,0.5到0的距离与到1的距离相等,于是,round函数就选择了0这个偶数。HALF EVEN被称为银⾏家舍⼊法,它的另⼀条规则是,向最近的数字舍⼊!
我们再来看⼏个round函数⼩数结果的例⼦:
看看⾼亮的3-6⾏,round函数都⼲了些什么......我们要来分别看⼀下3.48,3.15,2.15以及5.15这四个⼩数对应的浮点数是什么样的,就明⽩了:
decimal模块的Decimal对象,可以将float数据,映射为底层的更精确的表⽰。
⼩数3.15的浮点数表⽰是保留⼩数点后1位,向最近的数字舍⼊,就是3.1;
⼩数2.15的浮点数表⽰是保留⼩数点后1位,向最近的数字舍⼊,就是2.1;
round函数没有做错!看起来错在了float对象的不精确表⽰上⾯。(计算机⽆法⽤⼆进制来精确的表⽰⼗进制的⼩数)
因此,在⼀些对精度要求不是很⾼的地⽅,我们可以使⽤round函数来做HALF EVEN的舍⼊。如果对精度要求很⾼呢?如果我们就是要对⼩数3.15做⼩数点后1位的四舍五⼊,得到3.2,应该怎么办呢?
⽤decimal模块的接⼝做四舍五⼊
使⽤decimal模块的接⼝,可以实现⼩数精确的四舍五⼊。decimal模块是Python的⼀个标准库,是专门为⼗进制⼩数的精确计算⽽设计的。⽤decimal模块做⼗进制⼩数的计算,是符合直觉的:
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') == Decimal('0.3')
True
>>> Decimal('0.1') + Decimal('0.2')
Decimal('0.3')
本⽂不对decimal模块做过多介绍,只说明如何⽤它来做⼩数的精确的四舍五⼊,请看如下代码:
>>> Decimal('2.15').quantize(Decimal('.0'), rounding=ROUND_HALF_UP)
Decimal('2.2')
>>> Decimal('3.15').quantize(Decimal('.0'), rounding=ROUND_HALF_UP)
Decimal('3.2')
>>> Decimal('3.14159265').quantize(Decimal('.0000'), rounding=ROUND_HALF_UP)
Decimal('3.1416')
>>> Decimal('3.14159265').quantize(Decimal('.000'), rounding=ROUND_HALF_UP)
Decimal('3.142')
>>> Decimal('3.14159265').quantize(Decimal('.00'), rounding=ROUND_HALF_UP)
Decimal('3.14')
>>> str(Decimal('3.14'))
'3.14'
使⽤quantize成员函数,第1个参数指定了精度,关键是第2个参数,指定了截取的⽅式,ROUND_HALF_UP,就是四舍五⼊!最后,可以轻松将Decimal对象转换成字符串。
以上就是对于在Python中实现⼩数的四舍五⼊的⽅法介绍,希望能被您喜欢...
-- EOF --

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。