天天看點

android float類型保留兩位小數_python小數計算時的精度問題處理問題舉例解決方法精度和進位

問題舉例

數字計算由于資料結構底層問題,導緻會某些情況下存在精度丢失問題,JavaScript也存在同類問題,可以使用decimal.js庫,用法與python相似

android float類型保留兩位小數_python小數計算時的精度問題處理問題舉例解決方法精度和進位
In [5]: 0.1+0.1+0.1Out[5]: 0.30000000000000004In [13]: 0.1*3Out[13]: 0.30000000000000004
           

解決方法

使用python内建庫decimal可以進行準确的計算

android float類型保留兩位小數_python小數計算時的精度問題處理問題舉例解決方法精度和進位
# 錯誤用法:In [15]: decimal.Decimal(0.1) * 3Out[15]: Decimal('0.3000000000000000166533453694')In [18]: decimal.Decimal(str(0.1 * 3))Out[18]: Decimal('0.30000000000000004')# 正确用法:In [20]: decimal.Decimal('0.1') * 3Out[20]: Decimal('0.3')In [21]: decimal.Decimal('0.1') * decimal.Decimal('3')Out[21]: Decimal('0.3')# 錯誤用法:In [23]: decimal.Decimal(0.1) + decimal.Decimal(0.1) + decimal.Decimal(0.1)Out[23]: Decimal('0.3000000000000000166533453694')# 正确用法:In [24]: decimal.Decimal(str(0.1)) + decimal.Decimal(str(0.1)) + decimal.Decimal(str(0.1))Out[24]: Decimal('0.3')
           
注意:小數計算時必須先轉換為Decimal類型,且必須先轉為為字元串傳參,否則使用float類型傳入的Decimal數已經是丢失精度,将失去使用Decimal的作用

精度和進位

quantize()方法可實作保留多少位小數操作,第一個參數為保留多少位,比如'0'不保留小數,'.00'保留兩位小數

# 四舍五入:In [43]: decimal.Decimal(123.214).quantize(decimal.Decimal('.00'), decimal.ROUND_HALF_UP)Out[43]: Decimal('123.21')In [44]: decimal.Decimal(123.215).quantize(decimal.Decimal('.00'), decimal.ROUND_HALF_UP)Out[44]: Decimal('123.22')# 始終不進位In [45]: decimal.Decimal(123.214).quantize(decimal.Decimal('.00'), decimal.ROUND_DOWN)Out[45]: Decimal('123.21')In [46]: decimal.Decimal(123.215).quantize(decimal.Decimal('.00'), decimal.ROUND_DOWN)Out[46]: Decimal('123.21')# 始終進位In [47]: decimal.Decimal(123.214).quantize(decimal.Decimal('.00'), decimal.ROUND_UP)Out[47]: Decimal('123.22')In [48]: decimal.Decimal(123.215).quantize(decimal.Decimal('.00'), decimal.ROUND_UP)Out[48]: Decimal('123.22')
           

繼續閱讀