天天看點

Python四舍五入及round、Decimal使用Python四舍五入大法結論

Python四舍五入及round、Decimal使用

  • Python四舍五入大法
    • round和Decimal的比對(預設decimal.ROUND_HALF_EVEN)
    • decimal.ROUND_CEILING和decimal.ROUND_FLOOR
    • decimal.ROUND_UP和decimal.ROUND_DOWN
    • decimal.ROUND_HALF_UP和decimal.ROUND_HALF_DOWN
    • decimal.ROUND_05UP
  • 結論

Python四舍五入大法

一直為Python的四舍五入感到困惑。機緣情況下,對Python四舍五入及Decimal能否達到我們平常日常生活中所用的的四舍五入進行一些實驗和思考。一切以實驗資料說話。

round和Decimal的比對(預設decimal.ROUND_HALF_EVEN)

print(round(3.155, 2))  # 輸出3.15,精确度差導緻四舍五入不準确
print(Decimal('3.145').quantize(Decimal('0.00')))  # 輸出3.14,預設decimal.ROUND_HALF_EVEN,四舍五入,向最後一位有效數字最近的偶數取整
print(Decimal('-3.145').quantize(Decimal('0.00')))  # 輸出-3.14,預設decimal.ROUND_HALF_EVEN,四舍五入,向最後一位有效數字最近的偶數取整
print(Decimal('3.155').quantize(Decimal('0.00')))  # 輸出3.16,預設decimal.ROUND_HALF_EVEN,四舍五入,向最後一位有效數字最近的偶數取整
print(Decimal('-3.155').quantize(Decimal('0.00')))  # 輸出-3.16,預設decimal.ROUND_HALF_EVEN,四舍五入,向最後一位有效數字最近的偶數取整
           

decimal.ROUND_CEILING和decimal.ROUND_FLOOR

print(Decimal('3.151').quantize(Decimal('0.00'), decimal.ROUND_CEILING))  # 輸出3.16,總是趨向無窮大向上取整
print(Decimal('-3.159').quantize(Decimal('0.00'), decimal.ROUND_CEILING))  # 輸出-3.15,總是趨向無窮大向上取整
print(Decimal('3.159').quantize(Decimal('0.00'), decimal.ROUND_FLOOR))  # 輸出3.15,總是趨向負無窮大向下取整
print(Decimal('-3.151').quantize(Decimal('0.00'), decimal.ROUND_FLOOR))  # 輸出-3.16,總是趨向負無窮大向下取整
           

decimal.ROUND_UP和decimal.ROUND_DOWN

print(Decimal('3.151').quantize(Decimal('0.00'), decimal.ROUND_UP))  # 輸出3.16,朝0的反方向取整
print(Decimal('-3.151').quantize(Decimal('0.00'), decimal.ROUND_UP))  # 輸出-3.16,朝0的反方向取整
print(Decimal('3.159').quantize(Decimal('0.00'), decimal.ROUND_DOWN))  # 輸出3.15,總是趨向0取整
print(Decimal('-3.159').quantize(Decimal('0.00'), decimal.ROUND_DOWN))  # 輸出-3.15,總是趨向0取整
           

decimal.ROUND_HALF_UP和decimal.ROUND_HALF_DOWN

print(Decimal('3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 輸出3.15,四舍五入,大于等于5朝0的反方向取整
print(Decimal('-3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 輸出-3.15,四舍五入,大于等于5朝0的反方向取整
print(Decimal('3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 輸出3.16,四舍五入,大于等于5朝0的反方向取整
print(Decimal('-3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 輸出-3.16,四舍五入,大于等于5朝0的反方向取整

print(Decimal('3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 輸出3.14,五舍六入,小于等于5總是趨向0取整
print(Decimal('-3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 輸出-3.14,五舍六入,小于等于5總是趨向0取整
print(Decimal('3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 輸出3.15,五舍六入,小于等于5總是趨向0取整
print(Decimal('-3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 輸出-3.15,五舍六入,小于等于5總是趨向0取整
           

decimal.ROUND_05UP

print(Decimal('3.151').quantize(Decimal('0.00'), decimal.ROUND_05UP))  # 輸出3.16,官方解釋是如果是0或5,則朝0的反方向取整,否則朝0取整,但是實驗結果貌似不是這樣
print(Decimal('-3.151').quantize(Decimal('0.00'), decimal.ROUND_05UP))  # 輸出-3.16,官方解釋是如果是0或5,則朝0的反方向取整,否則朝0取整,但是實驗結果貌似不是這樣
           

結論

經過了以上的比對後,發現decimal.ROUND_HALF_UP的用法,更貼近我們日常生活中對四舍五入的用法習慣。