Python3 浮點數精度問題

'''
很多語言中都有浮點數數據精度的問題,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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章