python浮點數四捨五入的問題的分析

2021-10-08 05:32:04 字數 799 閱讀 9341

python中round做四捨五入要說清楚並不容易。有一種奇進偶舍的說法並不準確。

下面的例子就無法用奇進偶舍來解釋:

print(round(1.275,2))

1.27

原因分析

float採用二進位制編碼描述浮點數。在二進位制表示中,大多數有限位十進位制小數無法使用有限位二進位制進行精確表示。也就是說,有限位數的十進位制小數,往往會變為無限位數的二進位制小數。

對不能使用有限位二進位制小數表示的十進位制有限位小數,在系統中儲存的是這些十進位制浮點數的近似值。在近似值中,分為進製和截斷兩種型別,近似誤差一般在10e−17 左右。進製近似值大於原值,截斷近似值小於原值。

表示為二進位制近似值後,python系統在進行round計算時,使用近似值,不是使用原值。

python在儲存浮點數的時候,都是用和十進位制最接近的數值。例如:

>>> format(1.275,'.20f')

'1.27499999999999991118'

再說回四捨五入的基本策略:

靠近最近(四捨六入);

距離相同時,保證最後一位是偶數;

做基本的四捨五入的時候,都是使用系統內表示的值,比如說1.275,系統內表示為1.27499999999999991118,所以四捨五入之後就是1.27;

對於能夠用有限位二進位制表示的有限位數的十進位制小數,如果要捨入的那位是5,比如說1.125,四捨五入保留2位就是1.12(結果的最後一位是偶數)。

1.12500000000000000000

1.12

1.37500000000000000000

1.38

float浮點數的四捨五入

前幾天,有個小夥伴在做實驗過程中,發現了乙個奇怪的現象,這個現象就是 他在用printf輸出浮點數的時候,想把資料保留到小數點後的兩位,他是這麼寫的 float c 1.155 printf 2f c 他的書寫是對的,沒有錯誤。但是他發現,當c等於1.555時,保留兩位小數輸出是1.55,而當c等於...

php浮點數四捨五入函式

在php中浮點數四捨五入的兩個常用的函式round與此同時ceil函式,可能小數保留位數.round 函式對浮點數進行四捨五入 語法 float round float val int precision 返回將 val 根據指定精度 precision 十進位制小數點後數字的數目 進行四捨五入的結...

Python浮點數四捨五入問題的分析與解決方法

昨天遇到乙個問題,在 6.6045 保留三位小數時,使用 round 函式進行計算,我們希望得到 6.605,然而 round 6.6045,3 6.604 網上有人說,因為在計算機裡面,小數是不精確的,例如 1.115 在計算機中實際上是 1.114999999999999991182,所以當你對...