分割两个整数,一个大整数和一个小整数时得到错误的答案

时间:2017-08-20 16:14:07

标签: python python-3.x scientific-notation

我试图用一个主筛来找到某些数字的所有主要因素。在我的代码中,我最终必须将一个非常大的数字除以一个小数字,以找到超出我所使用的筛子范围的素数因子。这不应该是一个问题,事实上,该方法适用于我检查的每个数字,除了一个。

我遇到的问题是我将这个大数字除以51以找到素数因子,然后当我乘以51时检查它是否等于原始数字...... IT DOESN' T !!

无论我将其转换为int还是将其作为科学记数法中的浮点数,它都无效。

我知道花车并不完美,但我不知道如何解决这个奇怪的错误。我甚至将数字插入计算器并得到正确的答案,但我的代码给了我错误的答案。

这里发生了什么? 如果您运行我的代码,您将看到检查返回False,它们对于两者都应为True。

正如我之前所说的,这个方法适用于我正在测试的其中一个数字,这个数字超出了我使用的筛子范围,只有这个特定的大数字我才有问题。

正确答案应为1,176,462,117,668,023,508,828,242,241 我得到的答案是1,176,462,117,668,023,481,334,235,136

l_number = 59999568001069198950240354291
answer = 59999568001069198950240354291 / 51
int_answer = int(answer)
check = int_answer*51
check2 = answer * 51

print("The large number is: {:,d}".format(l_number))
print("Large number divided by 51: ", answer)
print("If the check is == original number: ", check2 == 59999568001069198950240354291)
print("Large number divided by 51 as an integer: {:,d}".format(int_answer))
print("That answer * 51 (should be original number): {:,d}".format(check))
print("If the integer check is == original number: ", check == 59999568001069198950240354291)

1 个答案:

答案 0 :(得分:1)

正如您所指出的,由于64位双精度可用的精度有限,浮点除法并不准确。

如果使用整数除法(在Python 3中)

,则有效
answer = 59999568001069198950240354291 // 51

这是因为Python使用任意精度整数运算。