2016-05-12 54 views
3

因此,我開始構建一個函數,旨在糾正超出一定限制的前3個「分配」。計算float和存儲到列表給出了奇怪的值?

下面的函數現在返回一個列表,其中傳遞列表中每個值超出的值。

def correct_wrong_allocations_zw(weight_vect): 
    temp_weight_vect = list(weight_vect[:3]) 

    limits = [1.00, 0.30, 0.25] 
    too_much_list = [] 

    too_much = 0.00 
    for i in range(0, len(temp_weight_vect)): 
     if temp_weight_vect[i] > limits[i]: 
      too_much_list.append(temp_weight_vect[i]-limits[i]) 

    return too_much_list 

allocations = [0.10, 0.40, 0.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00] 
allocations = correct_wrong_allocations_zw(allocations) 
print allocations 

分配[1]和限制之間的差異[1]爲0.10,但這個方案的結果是:

[0.10000000000000003, 0.25] 

這是怎麼回事?

+0

使用格式化的printf四捨五入值。所使用的內部二進制表示不能與理性1/10完全匹配,多於一個打印的十進制可以完全匹配理性1/3。 – mpez0

+0

如果要控制浮點精度超出格式化輸出,請查看[decimal](https://docs.python.org/2.7/library/decimal.html)模塊。 – schwobaseggl

+1

我希望人們會停止鏈接到該通用問題,並找到更多Python特定的東西,因爲它們的工作方式或每種語言的固定方式都有細微差別。 –

回答

2

這個,Floating Point Arithmetic: Issues and Limitations,可能會對您有幫助。

注意,這是在二進制浮點的本質:這是 不是Python中的錯誤,這是不是在你的代碼中的bug無論是。 您會在所有語言中看到支持您的硬件浮點運算的相同類型的東西(雖然有些語言在默認情況下或在所有輸出模式下可能不會顯示差異)。


BTW,您可以使用該模塊decimal看到存儲在任何特定的Python浮點精確值。在你的情況下,

>>> from decimal import Decimal 
>>> Decimal(0.4-0.3) 
Decimal('0.100000000000000033306690738754696212708950042724609375') 
+1

如果你需要做精確的十進制算術,你也可以使用'Decimal'模塊。 –