在尝试解决 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"
。这里发生了什么?
最佳答案
在 Python 3 中有两种类型的除法, float 和真除法。浮点除法将产生一个 float ,而真正的除法会将 float 四舍五入到最接近的整数并返回一个整数:
>>> 1 / 1 # floating-point division
1.0
>>> 1 // 1 # true division
1
>>>
在您的例子中,您使用的是就地浮点除法运算符 /=
。您需要使用就地真正的除法运算符:
number //= base
随着 fn
值的变化是预期的结果,100000000
:
>>> fn = friendly_number(10**32)
>>> fn
'100000000'
>>>
关于python - 将整数解析为字符串的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134480/