此模块提供了十进制的浮点计算支持
Decimal.from_float(12.222)
#Decimal(‘12.2219999999999995310417943983338773250579833984375‘)
#此处的decimal对象就是一个高精度数据
#实际上此处也发生了精度丢失
Decimal(‘12.222‘)
# 必须传入字符串
# 直接使用如上的方式建立即可
getcontext().prec = 6
getcontext().rounding = getattr(decimal, ‘ROUND_CEILING‘)
# decimal在一个独立的context上工作,可以通过getcontext来获取环境并进行设置
Decimal(1)/Decimal(7)
# 结果为Decimal(‘0.142857‘),六个有效数字
print(getcontext())
# Context(prec=28, rounding=ROUND_HALF_EVEN)
Decimal(‘50.5679‘).quantize(Decimal(‘0.00‘))
# quantize用于固定小数点的位数
# 结果为Decimal(‘50.57‘),结果四舍五入保留了两位小数
# 可以将获得的结果使用str()进行转换,这样不会损失精度
ROUND_UP:舍弃小数部分非0时,在前面增加数字,如 5.21 -> 5.3;
ROUND_DOWN:舍弃小数部分,从不在前面数字做增加操作,如5.21->5.2;
ROUND_CEILING:如果Decimal为正,则做ROUND_UP操作;如果Decimal为负,则做ROUND_DOWN操作;
ROUND_FLOOR:如果Decimal为负,则做ROUND_UP操作;如果Decimal为正,则做ROUND_DOWN操作;
ROUND_HALF_DOWN:如果舍弃部分>.5,则做ROUND_UP操作;否则,做ROUND_DOWN操作;
ROUND_HALF_UP:如果舍弃部分>=.5,则做ROUND_UP操作;否则,做ROUND_DOWN操作;(此项就是通常的四舍五入)
ROUND_HALF_EVEN:如果舍弃部分左边的数字是奇数,则做ROUND_HALF_UP操作;若为偶数,则做ROUND_HALF_DOWN操作;
from decimal import *
def round_half(value):
value = Decimal(value)
print(value)
getcontext().rounding = ‘ROUND_HALF_UP‘
print(value)
value = value.quantize(Decimal(‘0.00‘))
return value
print(round_half(‘80.845‘))
# 80.845
# 80.845
# 80.85
注意输入必须为字符串,使用float输入会发生精度丢失
(此处也不应该使用Decimal.from_float())
其次选择小数保留方式以及固定小数位置
最后输出仍然是一个decimal类型,可以使用str()转换
原文:https://www.cnblogs.com/lixin2011/p/13877988.html