首页 > 其他 > 详细

decimal模块

时间:2020-10-26 14:37:19      阅读:22      评论:0      收藏:0      [点我收藏+]

此模块提供了十进制的浮点计算支持

  • 从浮点数转换为decimal对象
Decimal.from_float(12.222)
#Decimal(‘12.2219999999999995310417943983338773250579833984375‘) 
#此处的decimal对象就是一个高精度数据
#实际上此处也发生了精度丢失
Decimal(‘12.222‘)
# 必须传入字符串
# 直接使用如上的方式建立即可
  • 设定工作精度(最大小数位数,主要用于运算,并不是固定的小数位数),round类型及其他参数
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类型

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()转换

decimal模块

原文:https://www.cnblogs.com/lixin2011/p/13877988.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!