python 浮點數四舍六入五成雙


問題
a = 0.215
b = 0.225
print round(a, 2)
print round(b, 2)

# 執行結果
0.21
0.23
  • 0.215 在進行四舍五入時,保留的兩位小數沒有進1
  • 0.225 在進行四舍五入時,保留的兩位小數可以進1
原因
  • 因為在 Python3 里面,round 對小數的精確度采用了 四舍六入五成雙 的方式。

  • 例如對於一個浮點數 a.bcd,需要精確到小數點后兩位,那么就要看小數點后第三位:

    • 如果 d 小於 5,直接舍去;
    • 如果 d 大於 5,直接進位;
    • 如果 d 等於 5:
      • d 后面沒有數據,且 c 為偶數,那么不進位,保留 c
      • d 后面沒有數據,且 c 為奇數,那么進位,c 變成 (c + 1)
    • 如果 d 后面還有非 0 數字,例如實際上小數為 a.bcdef,此時一定要進位,c 變成 (c + 1)
  • 所以,round 給出的結果如果跟設想的不一樣,那么需要考慮兩個原因:

    • 你的這個小數在計算機中能不能被精確儲存?如果不能,那么它可能並沒有達到四舍五入的標准,例如 1.115,它的小數點后第三位實際上是 4,當然會被舍去
    • 如果你的這個小數在計算機中能被精確表示,那么,round 采用的進位機制是奇進偶舍,所以這取決於你要保留的那一位,它是奇數還是偶數,以及它的下一位后面還有沒有數據
解決四舍五入精度問題
#!/usr/bin/python
# -*- encoding: utf-8 -*-
from decimal import Decimal
import decimal

# 四舍五入,保留2位小數
def setDecimal(data, dec_place='0.00'):
    return Decimal(data).quantize(Decimal(dec_place), rounding=decimal.ROUND_HALF_UP)

a = '0.215'
b = '0.225'

print round(setDecimal(a), 2)
print round(setDecimal(b), 2)

# 輸出結果
0.22
0.23
  • 注意:decimal 接收的參數必須是字符串,不能是浮點數;如果是浮點數結果依然不准確
  • 如果你傳入的參數為浮點數,並且這個浮點值在計算機里面不能被精確存儲,那么它會先被轉換為一個不精確的二進制值,然后再把這個不精確的二進制值轉換為等效的十進制值
  • 對於不能精確表示的小數,當你傳入的時候,Python 在拿到這個數前,這個數就已經被轉成了一個不精確的數了。所以雖然參數傳入的是 11.245,但是 Python 拿到的實際上是 11.24499999999


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM