Python 浮点数精度问题

'''
很多语言中都有浮点数数据精度的问题,Python中也是
例如:0.1 + 0.2 应该等于0.3  但结果 事实上是 0.30000000004
首先说原因:
    1、小数转换成二进制的方法:将小数部分先乘以2,记录整数部分,然后将得到的结果的小数部分乘以2,记录整数部分,直到乘法得到的结果是整数1时停止。
    实例:0.1的二进制计算方法如下
        0.1*2=0.2 0
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        0.8*2=1.6 1
        0.6*2=1.2 1
        0.2*2=0.4 0
        0.4*2=0.8 0
        .........
        因此0.1的二进制表示是无穷的0.0001100110011001100110011
        在Python 中是以双精度(64)位来保存浮点数,多余的部分会被截取掉,因此实际0.1在Python 中存储的是 0.00011001100110011001100110011001100110011001100110011001100
        因此在参与计算的时候,我们看到的是0.1。实际上 在计算中已经不是0.1了,而是一个很长的二进制数据,所以会存在误差。
消除误差的主要方法:
1、使用round() 函数指定小数点位数
2、使用decima 配合getcontext 来指定小数点精度
'''
print(0.1 + 0.2)

# 使用round 提高精度
# 语法 round(val, num) 参数为传入的数据和指定的小数点位数
print(round(0.1 + 0.2, 3)) # 指定小数点保留的位数,当最右边存在0时,自动抹除,进位采用四舍五入
print(round(1.234, 2))
print(round(1.235, 2))

# 使用decimal 和 getcontext 提高精度
from decimal import Decimal, getcontext
print('未指定精度')
print(Decimal(0.1) + Decimal(0.2)) # 发现使用decimal 计算时,小数后面计算的更加的精确
print(Decimal(1.234) + Decimal(1.2))

print('指定精度')
getcontext().prec = 4 # 指定精度,包含非零整数部分
print(Decimal(0.1) + Decimal(0.2)) # 再次输出,小数精度会发生改变。值得注意的是,它不会抹除0
print(Decimal(1.234) + Decimal(1.2))

输出结果

0.30000000000000004
0.3
1.23
1.24
未指定精度
0.3000000000000000166533453694
2.433999999999999941380224300
指定精度
0.3000
2.434
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章