python小數點 python 小數點問題

2021-10-11 04:50:25 字數 1926 閱讀 2040

我想生成一組小數,大小為從0到1,間隔為0.2,即:[0, 0.2, 0.4, 0.6, 0.8, 1]

1. while迴圈生成

a_list =

i = 0

while i <= 1:

i += 0.2

print(a_list)

列印結果為:

[0, 0.2, 0.4, 0.6000000000000001, 0.8, 1.0]

奇怪,為什麼會有0.600000000000001這樣子的結果呢?

如果我間隔設定為0.1,即我想要得到這樣的list:[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

a_list =

i = 0

while i <= 1:

i += 0.1

print(a_list)

列印結果為:

[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]

2.利用numpy包

import numpy as np

a = np.arange(0, 1, 0.2)

print(a)

列印結果為:

[0. 0.2 0.4 0.6 0.8]

# 解釋: 由於結果是array,0後面跟了乙個點。每個數值用空格隔開。

將array轉成list

print(a.tolist())

列印結果:

[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]

和while迴圈生成的結果還是一樣。

再用0.1的間隔試一下:

b = np.arange(0, 1, 0.1)

print b.tolist()

列印結果:

[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]

居然跟while迴圈生成的還不一樣了。

不知道該怎麼解釋了?

浮點數的乙個普遍問題是它們並不能精確的表示十進位制數。 並且,即使是最簡單的數**算也會產生小的誤差,比如:

>>> a = 4.2

>>> b = 2.1

>>> a + b

6.300000000000001

>>> (a + b) == 6.3

false

這些錯誤是由底層cpu和ieee 754標準通過自己的浮點單位去執行算術時的特徵。 由於python的浮點資料型別使用底層表示儲存資料,因此你沒辦法去避免這樣的誤差。

解決方法1:

round() 方法返回浮點數x的四捨五入值。第乙個引數是乙個浮點數,第二個引數是保留的小數字數,可選,如果不寫的話預設保留到整數。比如:

>>> round(10.0/3, 2)

3.33

>>> round(20/7)

如果不涉及到非常精確的計算:

l = list()

i=0while i <= 1:

i += 0.2

print(l)

[0, 0.2, 0.4, 0.6, 0.8, 1.0]

解決方法2:

decimal函式,

用在非常精確的小數或浮點數計算上

from decimal import decimal

l = list()

i = 0

while i <= 1 :

i +=0.2

print(l)

列印結果為:

['0.0', '0.2', '0.4', '0.6', '0.8', '1.0']

python小數錯誤 python 小數點問題

我想生成一組小數,大小為從0到1,間隔為0.2,即 0,0.2,0.4,0.6,0.8,1 1.while迴圈生成 a list i 0 while i 1 i 0.2 print a list 列印結果為 0,0.2,0.4,0.6000000000000001,0.8,1.0 奇怪,為什麼會有0...

Python 如何強制限定小數點位數

利用 af b 其中 b 代表要限定的數字,a 代表要求限定小數點的位數,結果自動四捨五入。hegiibrugc 1.264871331程式設計客棧241212 print 3f c 執行結果 1.265 補充 python numpy陣列格式化列印 指定小數點位數 numpy陣列格式化列印方法 指...

Python刪除小數點後多餘的0

刪除小數點後多餘的0 輸入12.22 12.20 12.0輸出 12.22 12.2 12 判斷型別並結合字串的rstrip def delete extra zero n 刪除小數點後多餘的0 ifisinstance n,int return n ifisinstance n,float n s...