python 中的奇怪除法行为
Weird behaviour of division in python
我正在尝试解决 hackerrank 中的 this 问题。在某些时候,我必须检查一个数字是否整除 n(给定输入)。
除了一个测试用例(不是问题),此代码运行良好:
if __name__ == '__main__':
tc = int(input().strip())
for i_tc in range(tc):
n = int(input().strip())
while n % 2 == 0 and n is not 0:
n >>= 1
last = 0
for i in range(3, int(n ** 0.5), 2):
while n % i == 0 and n > 0:
last = n
n = n // i # Concentrate here
print(n if n > 2 else last)
现在您可以看到,只有当 i 是 n.For 的因数时,我才除以数字。例如,如果数字是 i = 2 和 n = 4,则 n / 2 和 n // 2 不是'有什么区别吧。
但是当我使用下面的代码时,所有测试用例都失败了:
if __name__ == '__main__':
tc = int(input().strip())
for i_tc in range(tc):
n = int(input().strip())
while n % 2 == 0 and n is not 0:
n >>= 1
last = 0
for i in range(3, int(n ** 0.5), 2):
while n % i == 0 and n > 0:
last = n
n = n / i # Notice this is not //
print(n if n > 2 else last)
这不是第一个 time.Even this 问题我遇到了同样的问题 thing.For 这个问题我只需要除以 2 所以我使用右移运算符来摆脱this.But这里我什么也做不了,因为右移帮不了我。
为什么会这样?如果数字很小,我看不出有什么区别,但随着数字变大,它的行为会有所不同。
当 / 失败时使用 // 甚至不直观。这是什么原因?
由于n
和i
是int
和n % i == 0
类型,所以n // i
和n / i
之间存在差异的主要原因是那个
n // i
的类型仍然是 int
而 n / i
的类型是 float
和
- Python 中的整数具有无限精度,而浮点数的精度是有限的。
因此,如果 n // i
的值超出了 python float
类型可以准确表示的范围,那么它将不等于 [的计算值=12=].
插图:
>>> (10**16-2)/2 == (10**16-2)//2
True
>>> (10**17-2)/2 == (10**17-2)//2
False
>>> int((10**17-2)//2)
49999999999999999
>>> int((10**17-2)/2)
50000000000000000
>>>
我正在尝试解决 hackerrank 中的 this 问题。在某些时候,我必须检查一个数字是否整除 n(给定输入)。
除了一个测试用例(不是问题),此代码运行良好:
if __name__ == '__main__':
tc = int(input().strip())
for i_tc in range(tc):
n = int(input().strip())
while n % 2 == 0 and n is not 0:
n >>= 1
last = 0
for i in range(3, int(n ** 0.5), 2):
while n % i == 0 and n > 0:
last = n
n = n // i # Concentrate here
print(n if n > 2 else last)
现在您可以看到,只有当 i 是 n.For 的因数时,我才除以数字。例如,如果数字是 i = 2 和 n = 4,则 n / 2 和 n // 2 不是'有什么区别吧。
但是当我使用下面的代码时,所有测试用例都失败了:
if __name__ == '__main__':
tc = int(input().strip())
for i_tc in range(tc):
n = int(input().strip())
while n % 2 == 0 and n is not 0:
n >>= 1
last = 0
for i in range(3, int(n ** 0.5), 2):
while n % i == 0 and n > 0:
last = n
n = n / i # Notice this is not //
print(n if n > 2 else last)
这不是第一个 time.Even this 问题我遇到了同样的问题 thing.For 这个问题我只需要除以 2 所以我使用右移运算符来摆脱this.But这里我什么也做不了,因为右移帮不了我。
为什么会这样?如果数字很小,我看不出有什么区别,但随着数字变大,它的行为会有所不同。
当 / 失败时使用 // 甚至不直观。这是什么原因?
由于n
和i
是int
和n % i == 0
类型,所以n // i
和n / i
之间存在差异的主要原因是那个
n // i
的类型仍然是int
而n / i
的类型是float
和- Python 中的整数具有无限精度,而浮点数的精度是有限的。
因此,如果 n // i
的值超出了 python float
类型可以准确表示的范围,那么它将不等于 [的计算值=12=].
插图:
>>> (10**16-2)/2 == (10**16-2)//2
True
>>> (10**17-2)/2 == (10**17-2)//2
False
>>> int((10**17-2)//2)
49999999999999999
>>> int((10**17-2)/2)
50000000000000000
>>>