Python控制小数精度:round与decimal模块详解
本文详解Python中控制小数精度的两种主要方法。首先解析内置round()函数采用的ROUND_HALF_EVEN(四舍六入五成双)策略及其与常规四舍五入的区别。其次,针对超过17位小数的高精度需求,介绍使用decimal模块配合getcontext()设置更高精度的方案,并对比格式化输出的局限性。最后梳理round、ceil和floor等取整函数的具体行为。
一、要求较小的精度
将精度高的浮点数转换为精度较低的浮点数。
1. round()内置方法
round()并非简单的四舍五入处理方式。
>>> round(2.5)
2
>>> round(1.5)
2
>>> round(2.675)
3
>>> round(2.675, 2)
2.67
当round()仅接收一个参数且不指定位数时,返回最接近该数的整数(类似四舍五入)。但在遇到.5的情况时,由于距离两端相等,round()会返回最接近的偶数,例如round(2.5)结果为2。
当指定保留的小数位数时,通常遵循四舍五入规则,但在遇到.5的情况时,若舍去位前的数字为奇数,则直接舍去;若为偶数,则向上进位。
参考以下示例:
>>> round(2.635, 2)
2.63
>>> round(2.645, 2)
2.65
>>> round(2.655, 2)
2.65
>>> round(2.665, 2)
2.67
>>> round(2.675, 2)
2.67
2. 使用格式化
其效果与round()一致。
>>> a = ("%.2f" % 2.635)
>>> a
'2.63'
>>> a = ("%.2f" % 2.645)
>>> a
'2.65'
>>> a = int(2.5)
>>> a
2
二、要求超过17位的精度分析
Python默认的浮点数精度为17位小数,但当计算需要更高精度(超过17位小数)时,应如何处理?
1. 使用格式化(不推荐)
>>> a = "%.30f" % (1/3)
>>> a
'0.333333333333333314829616256247'
虽然可以显示更多位数,但结果不准确,后续数字往往无实际意义。
2. 高精度使用decimal模块,配合getcontext
>>> from decimal import *
>>> print(getcontext())
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero,
Overflow])
>>> getcontext().prec = 50
>>> b = Decimal(1)/Decimal(3)
>>> b
Decimal('0.33333333333333333333333333333333333333333333333333')
>>> c = Decimal(1)/Decimal(17)
>>> c
Decimal('0.058823529411764705882352941176470588235294117647059')
>>> float(c)
0.058823529411764705
默认的context精度为28位,可设置为50位或更高,从而在分析复杂浮点数时拥有可控的高精度。
需注意context中的rounding=ROUND_HALF_EVEN参数,即ROUND_HALF_EVEN策略:当处于中间值时,向最近的偶数舍入。
三、关于小数和取整
讨论小数时,必然涉及整数。一般取整会用到以下函数:
1. round()
前文已述,务必注意它并非简单四舍五入,而是采用ROUND_HALF_EVEN策略。
2. math模块的ceil(x)
返回大于或等于x的最小整数。
3. math模块的floor(x)
返回小于或等于x的最大整数。
>>> from math import ceil, floor
>>> round(2.5)
2
>>> ceil(2.5)
3
>>> floor(2.5)
2
>>> round(2.3)
2
>>> ceil(2.3)
3
>>> floor(2.3)
2
>>>
以上就是Python输出小数控制方法的详细内容,更多关于Python输出小数的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













