Python浮点型数据小数点的取舍

python默认的是17位小数的精度

1、round()内置方法

π=3.1415926535

new_num=round(π,2)     #四舍五入保留两位小数

print(new_num)              #结果为:3.14

round()如果只有一个数作为参数,不指定位数的时候,返回的是一个整数,而且是最靠近的整数(这点上类似四舍五入)。但是当出现.5的时候,两边的距离都一样,round()取靠近的偶数,这就是为什么

round(2.5) = 2。当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的这样情况,如果要取舍的位数前的小数是奇数,则直接舍弃,如果偶数这向上取舍。

2、格式化(效果等同于round())

>>> a=('%.2f'%3.235)
>>> a
'3.23'
>>> a=('%.2f'%3.245)
>>> a
'3.25'
>>> a=int(6.5)
>>> a
6
>>> a=int(6.665)
>>> a
6
超过17位小数的高精度

1、使用格式化(不推荐)

>>> a='%.20f'%(1/3)
>>> a
'0.33333333333333331483'

可以看出结果不准确,后面的数字往往没有意义。

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=20
>>> b=decimal(1)/decimal(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'decimal' is not defined
>>> b=Decimal(1)/Decimal(3)
>>> b
Decimal('0.33333333333333333333')
>>> c=Decimal(1)/Decimal(17)
>>> c
Decimal('0.058823529411764705882')
>>> float(c)
0.058823529411764705

取整数

1、round()上面已经讲过了,这里就不再做说明

2、math模块的ceil(x)

取大于或者等于x的最小整数。

>>> from math import *
>>> x=6.56
>>> ceil(x)
7
>>> x=6.06
>>> ceil(x)
7

3、math模块的floor(x)

取小于或者等于x的最大整数。

>>> from math import *

>>> x=8.00001
>>> floor(x)
8
>>> x=8.9999999999
>>> floor(x)
8

4、math模块的trunc(x)

截断除法,返回x的整数部分

>>> from math import *
>>> a=trunc(5.6789)
>>> a
5
>>> a=trunc(5.1234)
>>> a
5

>>> pi       #数字常量,圆周率
3.141592653589793

>>> a=trunc(pi)
>>> a
3

 round()函数当中有许多小坑

>>> a=round(1.675, 2)
>>> a
1.68
>>> a=round(2.675, 2)
>>> a
2.67

这些坑笔者也没搞清楚怎么回事,希望各位大佬指点

参考资料:https://www.cnblogs.com/herbert/p/3402245.html

原文地址:https://www.cnblogs.com/jasmine0627/p/9330985.html