解決python運算結果是浮點數問題

2021-10-22 15:28:45 字數 1765 閱讀 9494

solution

今天在實現乙個減法運算print(45.4-2*20)的結果中發現結果是5.399999999999999

網上查詢部落格才了解原來是自己啥也不是。。。:

因為浮點數在計算機中實際上是以二進位制的形式儲存的,有些數不精確。

例如:0.1是十進位制,轉化二進位制是無限迴圈的

1. 方法:十進位制小數轉換成二進位制小數的計算方法:採用「乘2取整,順序排列」法。

具體做法是:用2乘十進位制小數,可以得到積,將積的整數部分取出,再用2乘餘下的小數部分,又得到乙個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,此時0或1為二進位制的最後一位。或者達到所要求的精度為止。

然後把取出的整數部分按順序排列起來,先取的整數作為二進位制小數的高位有效位,後取的整數作為低位有效位。

2. 具體過程:

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.1轉化成二進位制是:0.0 0011 0011 …,而python中是以雙精度(64)位來儲存浮點數的因此多餘的位數會被截掉

因此,python中浮點運算不是直接的運算結果

例如:1.1+2.2不等於3.3

》 》所以到底如何解決呢?《

!我找了一些網上的答案,親測有效

例如:輸入應付金額與實付金額找零

// change零錢  vallist[

]面額陣列 *****張數

change=

round

(change-vallist[i]

******,

1)

round(變數,保留位數會四捨五入)

// 需要先導入庫

from decimal import decimal

a=decimal(

'1.1'

)b=decimal(

'2.2'

)print

(a+b)

如果要控制所有運算可以建立臨時上下文環境改變設定,使用with的上下文方式來指定精度ctx.prec

from decimal import decimal,localcontext

a=decimal(

'45.4'

)b=decimal(

'40'

)print

(a-b)

with localcontext(

)as ctx:

ctx.prec=

2print

(a-b)

5.4

5.4還有對decimal這個模組的應用,之後如果碰到我自己還會補充

python結果 Python中 的結果是什麼?

像這樣的表情x y計算為x y.優先順序與運算子相同。分組 及 乘法 9 2 9 2 9除以2等於4。4乘2等於8 9減8是1 剩餘部分。python抓到了 取決於您使用的python版本,也是 不推薦的 字串內插運算子,因此請注意,如果您來自具有自動型別轉換 如php或js 的語言,其中的表示式如...

浮點型運算結果是不精確的,會出現精度丟失

float a 1.1f float b 3.1415926f double b 1.1d double result a b 結果是2.2000 0002 3841 858 解析 單精度有7 8位小數,雙精度有15位小數 二進位制儲存,單精度只有16個二進位制位,雙精度有64個二進位制位,二進位制...

完美軟體不是結果,是追求

從事軟體專案開發和管理多年,在企業做過,在軟體公司也做過,放眼過去,在企業做開發,軟體系統都是自已架構自已一行行寫出來的,隨著時間變遷,技術也進步了不少,回頭看以前的 發現很多地方寫得不好,但又不想也沒太多時間去重寫或大量的改動,於是,形成了一開始做的模組的 寫得很爛,中間做的模組的 寫得精練一些,...