2017-07-17 43 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