2017-07-17 42 views
1

嘗試解決checkio練習時,我偶然發現了一個奇怪的行爲。將整數解析爲字符串的意外行爲

def friendly_number(number, base=1000, decimals=0, suffix='', 
      powers=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']): 
    power_i = 0  
    while abs(number) >= base and power_i < len(powers)-1: 
     number /= base 
     power_i += 1 

    number_str = str(number) 

    return number_str 

fn = friendly_number(10**32) 

我期待fn == "100000000",但我得到了fn = "99999999.99999999"。我縮小到步驟number_str = str(number)。最奇怪的是在命令行測試了這個:當我這樣做時,返回的值是"100000000"。這裏發生了什麼?

+0

從你的輸出和你的期望輸出I懷疑你可能會遇到[浮動數字問題](http://floating-point-gui.de/)。 –

+0

您需要使用帶雙斜線的'// ='。這告訴Python你想把分割的結果四捨五入到最接近的整數=。 –

+0

這是蟒蛇2還是3? –

回答

3

在Python 3有兩種類型劃分,浮點真分區。浮點除法將產生浮動,而真司將全面浮到最接近的整數,並返回一個整數

>>> 1/1 # floating-point division 
1.0 
>>> 1 // 1 # true division 
1 
>>> 

在您的情況,您使用的就地浮點除法運算符, /=。您需要使用就地真司操作:

number //= base 

隨着fn值以上的變化是預期的結果,100000000

>>> fn = friendly_number(10**32) 
>>> fn 
'100000000' 
>>> 
1

在Python 3用途:

number //= base 

您當前的語句(number /= base)應該工作的罰款在Python 2