decimal借助整数来表示小数的方式解决了不精确的问题。
可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。
from decimal import *
Decimal.from_float(12.222)
# 结果为Decimal('12.2219999999999995310417943983338773250579833984375')
from decimal import *
getcontext().prec = 6
Decimal(1)/Decimal(7)
# 结果为Decimal('0.142857'),六个有效数字
from decimal import *
Decimal('50.5679').quantize(Decimal('0.00'))
# 结果为Decimal('50.57'),结果四舍五入保留了两位小数
from decimal import *
str(Decimal('3.40').quantize(Decimal('0.0')))
# 结果为'3.4',字符串类型
#用元组的形式创建小数
# 元组解析
# 元组参数一: 0,表示正数,1,表示负数
# 元组参数二:十进制整数,例如下面是198
# 元组参数三:小数点几位
t = (1, (1, 9, 8), -2)
print('Input :', t)
print('Decimal :', Decimal(t))
ROUND_CEILING 总是趋向无穷大向上取整
ROUND_DOWN 总是趋向0取整
ROUND_FLOOR 总是趋向负无穷大向下取整
ROUND_HALF_DOWN 如果最后一个有效数字大于或等于5则朝0反方向取整;否则,趋向0取整
ROUND_HALF_EVEN 类似于ROUND_HALF_DOWN,不过,如果最后一个有效数字值为5,则会检查前一位。 偶数值会导致结果向下取整,奇数值导致结果向上取整
ROUND_HALF_UP 类似于ROUND_HALF_DOWN,不过如果最后一位有效数字为5,值会朝0的反方向取整
ROUND_UP 朝0的反方向取整
ROUND_05UP 如果最后一位是0或5,则朝0的反方向取整;否则向0取整
ROUNDING_MODES = [
'ROUND_CEILING',
'ROUND_DOWN',
'ROUND_FLOOR',
'ROUND_HALF_DOWN',
'ROUND_HALF_EVEN',
'ROUND_HALF_UP',
'ROUND_UP',
'ROUND_05UP',
]
context = decimal.getcontext()
for rounding_mode in ROUNDING_MODES:
#print('{0:10}'.format(rounding_mode.partition('_')[-1]),end=' ')
for precision in [1, 2, 3, 4]:
context.prec = precision
context.rounding = getattr(decimal, rounding_mode)
value = decimal.Decimal(1) / decimal.Decimal(7)
print('{0:^8}'.format(value), end=' ')
value = decimal.Decimal(-1) / decimal.Decimal(8)
print('{0:^8}'.format(value), end=' ')
print()