python - 一大一小两个整数相除时得到错误答案

标签 python python-3.x scientific-notation

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

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

无论我将其转换为 int 还是将其保留为科学记数法中的 float ,它都不起作用。

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

这是怎么回事? 如果您运行我的代码,您将看到检查返回 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)

最佳答案

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

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

answer = 59999568001069198950240354291 // 51

这是可行的,因为 Python 使用任意精度整数算术。

关于python - 一大一小两个整数相除时得到错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45784263/

相关文章:

python - 轴在图上不按顺序

python - 使用 dask 分布式时 OMP_NUM_THREADS 出错

c++ - 转换为科学计数法时出现 double 错误

c# - 在 C# 中,如何在不使用 e 表示法的情况下向控制台写入一个小数字?

matlab - Matlab科学记数法中的前导零

python - 如何删除 "TypeError: can' t 乘以序列与类型 'float' 的非 int ”?

python - 尝试设置调用 Python 脚本的 Node.Js 服务器

python - 从网站读取 .tar.gz 文件的内容到 python 3.x 对象中

python - 如何在类型提示中指定函数类型?

Python - 将附加反斜杠添加到文件路径