我犯错了大数

时间:2016-10-25 20:04:00

标签: python

我正在尝试在python 2.7中编写一个程序,它首先会看到一个数字是否均匀地划分另一个,如果它确实得到了除法的结果。

然而,当我使用大数字时,我得到了一些有趣的结果。

目前我正在使用:

from __future__ import division
import math
a=82348972389472433334783
b=2
if a/b==math.trunc(a/b):
    answer=a/b
    print 'True' #to quickly see if the if loop was invoked

当我跑步时,我得到:

True

但82348972389472433334783显然不是。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:5)

这是一种疯狂的方式。只需使用余数运算符。

if a % b == 0:
    # then b divides a evenly
    quotient = a // b

答案 1 :(得分:1)

真正的除法隐式地将输入转换为浮点数,这些浮点数不能精确地准确存储a的值。例如。在我的机器上

>>> int(1E15+1)
1000000000000001
>>> int(1E16+1)
10000000000000000
因此你的精确度会下降。你的大号也会发生类似的事情(比较int(float(a))-a) 现在,如果你检查你的部门,你会看到结果"是"实际上发现是一个整数

>>> (a/b).is_integer()
True

事先并未真正预料到。

math.trunc函数执行类似的操作(来自docs): 将实际值x截断返回到Integral(通常是一个长整数)。

python的duck typing性质允许比较long整数和float,参见 Checking if float is equivalent to an integer value in pythonComparing a float and an int in Python

答案 2 :(得分:0)

为什么不使用模数运算符来检查数字是否可以均匀分配?

n%x == 0