我想生成一組小數,大小為從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...