在尝试解决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 :(得分:3)
在Python 3中,有两种类型的划分, 浮点 和 真正划分 。浮点除法将产生一个浮点数,而真正除法将浮点数舍入到最接近的整数并返回一个整数:
>>> 1 / 1 # floating-point division
1.0
>>> 1 // 1 # true division
1
>>>
在您的情况下,您正在使用就地浮点除法运算符/=
。您需要使用就地 true division 运算符:
number //= base
如果更改超出了fn
的值,则预期结果为100000000
:
>>> fn = friendly_number(10**32)
>>> fn
'100000000'
>>>
答案 1 :(得分:1)
在Python 3中使用:
number //= base
您当前的声明(number /= base
)在Python 2中应该可以正常工作。