python数字处理技巧(1): 精度舍入、精确运算、格式化、进制数、大数打包解包、复数、NaN、分数
1. 數字的四舍五入
當我們需要對整數 或者 浮點數進行四舍五入的時候。
- round(value, ndigits) ?/// 內置函數
對浮點數進行四舍五入(傳入的ndigit應該是正值,作用于十分位、百分位...):
print( round(1.23, 1) ) # 1.2 print( round(1.27, 1) ) # 1.3 print( round(-1.27, 1) ) #-1.3 print( round(1.25361, 3)) #1.254 print( round(2.5, 0) ) #2.0 近似到最近的偶數對整數進行四舍五入(傳入的ndigit應該是自然數,作用于個位、十位、百位...)
print( round(314159, -1)) #314160 print( round(314159, -2)) #314200 print( round(314159, -3)) #314000Comment:
不要將舍入round和格式化format輸出搞混淆了。 如果我們目的只是簡單的輸出一定寬度的數,不需要使用 round() 函數。 而僅僅只需要在格式化的時候指定精度即可。
pi = 3.1415926 print( format(pi, '0.2f')) #3.14 print( format(pi, '0.3f')) #3.142 print( 'the value is {:0.4f}'.format(pi) ) #the value is 3.14162. 執行精確的浮點數運算
有的時候我們需要對浮點數進行精度運算,并不希望出現小的誤差。但是由于浮點數并不能精確的表示十進制數。 并且,即使是最簡單的數學運算也會產生小的誤差,比如:
a = 4.2 b = 2.1 print( a + b ) # 6.300000000000001 print( a+b == 6.3 ) #False這些錯誤是由底層CPU和IEEE 754標準通過自己的浮點單位去執行算術時的特征。 由于Python的浮點數據類型使用底層表示存儲數據,因此沒辦法去避免這樣的誤差。
- decimal模塊 ?耗時但是精確
如果想更加精確(并能容忍一定的性能損耗),我們可以使用?decimal 模塊:
from decimal import Decimala = Decimal('4.2') b = Decimal('2.1') print(a+b) # 6.3其實呢,這段代碼看起來好像有點奇怪,比如用字符串來表示數字。 然而,Decimal對象會像普通浮點數一樣的工作。 我們打印它們時,看起來卻跟普通數字沒什么兩樣。
decimal 模塊的一個主要特征是允許控制計算的每一方面,包括數字位數和四舍五入運算。 為了這樣做,我們需要創建一個本地上下文并更改它的設置。
from decimal import localcontexta = Decimal('1.3') b = Decimal('1.7') print(a / b) # 0.7647058823529411764705882353with localcontext() as ctx:ctx.prec = 3print(a / b) # 0.765with localcontext() as ctx:ctx.prec = 50print(a / b) #0.764705882352941176470588235294117647058823529411763. 數字的格式化輸出
需要將數字格式化后輸出,并控制數字的位數、對齊、千位分隔符和其他的細節。格式化輸出單個數字的時候,可以使用內置的 format() 函數,比如:
x = 1234.56789print(format(x, '0.2f')) #'1234.57' print(format(x, '>10.1f')) #' 1234.6' print(format(x, '<10.10f')) #'1234.5678900000' print(format(x, '^10.1f')) #' 1234.6 ' print(format(x, ',')) #1,234.56789 print(format(x, 'e')) #1.234568e+03 print('The value is {:0,.2f}'.format(x)) # The value is 1,234.574. 二八十六進制整數
為了將整數轉換為二進制、八進制或十六進制的文本串, 可以分別使用 bin() , oct() 或 hex()函數。
x = 1234 print( bin(x) ) # 0b10011010010 print( oct(x) ) # 0o2322 print( hex(x) ) # 0x4d2# 如果不想輸出0b,0o或者0x的,使用 format() 函數 print( format(x, 'b') ) # 10011010010 print( format(x, 'o') ) # 2322 print( format(x, 'x') ) # 4d25. 字節到大整數的打包和解包
這里涉及到的是:如何將大整數利用字節進行處理。
- int.from_bytes() & int.to_bytes()
大整數和字節字符串之間的轉換操作并不常見。 然而,在一些應用領域有時候也會出現,比如密碼學或者網絡。 例如,IPv6網絡地址使用一個128位的整數表示。 如果要從一個數據記錄中提取這樣的值的時候。
6. 復數的數學運算
- complex(real, imag) 或者是帶有后綴j的浮點數來指定
7. 無窮大與NaN
Python并沒有特殊的語法來表示這些特殊的浮點值,但是可以使用 float() 來創建它們。
import math print( float('inf') ) # inf print( float('-inf') ) # -inf print( float('nan') ) # nana = float('inf') print( math.isinf(a) ) # true# 無窮大數在執行數學計算的時候會傳播 print( a+45 ) # inf8. 分數運算
- fractions
fractions 模塊可以被用來執行包含分數的數學運算。
from fractions import Fractiona = Fraction(5, 4) print( a ) # 5/4 print( a.numerator, a.denominator) # 5 4 print( float(a) ) # 1.25在大多數程序中一般不會出現分數的計算問題,但是有時候還是需要用到的。 比如,在一個允許接受分數形式的測試單位并以分數形式執行運算的程序中, 直接使用分數可以減少手動轉換為小數或浮點數的工作。
總結
以上是生活随笔為你收集整理的python数字处理技巧(1): 精度舍入、精确运算、格式化、进制数、大数打包解包、复数、NaN、分数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: API 层实现语音录制
- 下一篇: python数字处理技巧(2): Num