python小數錯誤 python 小數點問題

2021-10-19 21:23:18 字數 1926 閱讀 5468

我想生成一組小數,大小為從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 小數錯誤處理總結

原 版本 n1,n2 raw input split raw input split res str reduce lambda a,b 10a b,map lambda x ord x 0 ord x 1 2ord 0 list z l n1 1 1 n2 1 1 fillvalue 0 1 c ...

python 多執行緒 exit 函式 錯誤示範

python 多執行緒 exit 函式 錯誤示範 以下程式,第乙個執行緒 正常執行,第二個執行緒的 init的時候,呼叫exit 函式。這樣 主線程退出了。ctrl c什麼的都不管用了。只是 修改 第乙個執行緒為乙個孤兒 執行緒。等這個執行緒退出 主線程是在 var.start 這句話之前 就退出了...

一 函式錯誤機制

對於呼叫某些windows函式,不論成功與否,都會有乙個與之對應的 值來標識函式的呼叫情況,是成功或是失敗,如果失敗,則可根據該值進一步獲取失敗的原因。值的獲取通過呼叫函式getlasterror,該函式是執行緒安全的,因為獲取的是主調執行緒中的錯誤 值,其原理是使用執行緒本地儲存區來存放了錯誤 值...