将两个整数(一大一小)相除时得到错误答案

Posted

技术标签:

【中文标题】将两个整数(一大一小)相除时得到错误答案【英文标题】:Getting the wrong answer when dividing two integers, one large and one small 【发布时间】:2017-08-20 16:14:07 【问题描述】:

我正在尝试使用质数筛来查找某些数字的所有质因数。在我的代码中,我最终不得不将一个非常大的数字除以一个小数字,以找到一个超出我正在使用的筛子范围的素数。这应该不是问题,事实上,该方法对我检查的每个数字都非常有效,除了一个。

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

无论我将其转换为 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)

【问题讨论】:

我希望你有一个好的筛子。该数字的下一个素数(在 3 和 17 之后)是 143047654201 该方法找到因子3和17然后将它们相乘得到51,然后将原始数字除以51得到最后一个素因子。 我将 1e7 的参数用于筛子,以及任何大于通过将已知素数相乘并除以数字而找到的其他因子 【参考方案1】:

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

如果您使用整数除法(在 Python 3 中),它会起作用

answer = 59999568001069198950240354291 // 51

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

【讨论】:

非常感谢。如您所见,我对学习 Python 还是个新手,您在这里帮了我很大的忙!!!!

以上是关于将两个整数(一大一小)相除时得到错误答案的主要内容,如果未能解决你的问题,请参考以下文章

求助:C语言大整数相除

java中两个float数相除,应该是整数却成了小数

Python3基础 两个除号 两个整数相除 得到商的整数部分

将两个整数相除时,Clang 会产生奇怪的输出

两个int数据相除怎么得到double型数据

Objective-C:将两个整数相除并返回一个四舍五入的整数值