decimal模块

 

decimal借助整数来表示小数的方式解决了不精确的问题。

 

1.Decimal创建

可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。

 

2.要从浮点数据转换为Decimal类型

from decimal import *

Decimal.from_float(12.222)

# 结果为Decimal('12.2219999999999995310417943983338773250579833984375')

 

3.通过设定有效数字,限定结果样式

from decimal import *

getcontext().prec = 6

Decimal(1)/Decimal(7)

# 结果为Decimal('0.142857'),六个有效数字

 

4.四舍五入,保留几位小数

from decimal import *

Decimal('50.5679').quantize(Decimal('0.00'))

# 结果为Decimal('50.57'),结果四舍五入保留了两位小数

 

5.Decimal 结果转化为string

 

from decimal import *

str(Decimal('3.40').quantize(Decimal('0.0')))

# 结果为'3.4',字符串类型

 

6、用元组的形式创建小数

#用元组的形式创建小数

# 元组解析

# 元组参数一: 0,表示正数,1,表示负数

# 元组参数二:十进制整数,例如下面是198

# 元组参数三:小数点几位

t = (1, (1, 9, 8), -2)

print('Input :', t)

print('Decimal :', Decimal(t))

 

 

 

 

7.取整问题

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

 

 

 

 

你可能感兴趣的:(python)