2015-08-23 40 views
-1

我有一個簡單的代碼if語句條件心不是滿意,但仍計劃工作

def func(a,b): 
    if (b>=3.0) and (b<=4.0): 
     if (a>=3.0) and (a<=6.0): 
      var_region='A' 
     if (a>6.0) and (a<=11.0): 
      var_region='B' 
    if (b>4.0): 
     var_region='C' 

    region=var_region 
    print region 
    return region 


Tmax=4.1 
Tmin=3.0 
T=Tmin 
var=3.0 
dT=0.1 
while T<Tmax: 
    calll=func(var,T) 
    T=T+dT 

程序的輸出是:

A,A..........,C 

在while循環中,「T」的最終值4.0,並打印「C」而不是「A」。這是爲什麼?

回答

5

這是因爲浮點數不能用float精確表示,所以它的計算也不準確。 b並不完全是4.0,而是一個非常接近它的浮點數。添加這可能幫助你理解:

if (b>4.0): 
    print(repr(b)) 
    var_region='C' 

輸出:

4.000000000000001 
C 
-1

這是因爲0.1無法準確地表示爲一個浮點數,所以計算不給正是你所期望的結果。如果在函數內部打印b,則會發現在最後一次調用時,值爲4.000000000000001。順便說一句,在Python中,你不必寫笨拙的東西一樣

if (b>=3.0) and (b<=4.0): 

你可以寫

if 3.0 <= b <= 4.0: 
+0

歡迎來到StackOverflow!只是一個快速提示 - 多行代碼塊可以縮進四個空格,而不是使用反引號。 – Qix

+1

@Qix這裏沒有多行代碼?你在說什麼? – saulspatz

+0

有,它是一個多行代碼塊,跨越1行。 ;) – Qix

1

原因float類型是不是在計算機精確。

while T<Tmax: 
    print T 
    calll=func(var,T) 
    T=T+dT 

功能之前添加打印聲明,呼籲在while循環,你會發現T的終值是4.000000000000001if (b>4.0):會得到一個True值,並導致最後輸出爲C

我建議你使用十進制來實現你想要的,那種類型在計算機上是精確的

from decimal import Decimal 
Tmax = Decimal(4.1) 
...... 
+0

歡迎來到StackOverflow!只是一個快速提示 - 多行代碼塊可以縮進四個空格,而不是使用反引號。 – Qix

+1

哦,明白了,謝謝你的提示:-) –