【问题标题】:How do I check a laaaaaaaarge number to see if it is an integer?如何检查 laaaaaaaarge 数字以查看它是否为整数?
【发布时间】:2018-12-23 10:41:45
【问题描述】:

检查一个数字是浮点数还是整数是没有问题的。

这里有一些简单的方法:

a = 4

b = 4.123
  1. res = float(a).is_integer()
    

    返回TrueFalse

  2. if type(a) == int:
        print("a ist an integer")
    
  3. if a - int(a) == 0:
        print('Integer')
    else:
        print('No Integer')
    

但是当我有一个大的数字时,它就不再起作用了:

a = 31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423

b = 31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423.111

我想检查非常多和非常大的数字来解决数学问题。


编辑: 我应该提一下,这些数字也应该被识别为整数:

5.243
6.0
312423423534534564564567457546756756856856745634523423423423423.0

我的计算结果是浮点数。我想检查结果是否为整数。

对于大数,常规方法行不通。

【问题讨论】:

  • 检查模1除法余数是否为零。或者,将整数除以 1 并检查是否有区别。
  • 就您而言,4.00int 还是 float
  • 我不确定您的输入格式是什么。如果它已经是一个 Python 变量,那么所有建议的方法都可以工作。如果是文本,则搜索小数点分隔符可能会有所帮助。
  • 请不要在您的问题中添加“编辑”部分。过度工作以使其更清楚您想要什么。此外,您最近的编辑声称您希望 5.243 被视为整数!?
  • 这些大值从何而来,您如何存储它们?如果您使用的是标准 Python float(即 IEEE 754 64 位浮点),则幅度大于 2**52 的任何值都是整数。只有有限多个数字可以表示为 64 位浮点数。大于 2**52 的数字的子集是整数。

标签: python python-3.x int


【解决方案1】:

这对于您的示例中显示的数量级的数字是不可能的,并且实际上通常是不可能的,因为最终浮点的精度变得太粗糙而无法区分整数和浮点数。例如:

>>> 100000000000000000000000.5 == \ 
... 100000000000000000000000.0                                                                                                                                        
False
>>> 1000000000000000000000000.5 == \ 
... 1000000000000000000000000.0                                                                                                                                       
True

两个输入都被解析为相同的数字。如果您想区分它们,则需要在评估数字之前进入并访问原始来源(文本)。

【讨论】:

  • 并且要清楚,“在计算数字之前进入并访问原始源”通常意味着“重写源代码以停止为此使用浮点数”,而不是“将某些东西与源头检验”。
【解决方案2】:

简单地检查类型可能会产生误导。如果您正在尝试解决一个数学问题,其中您的函数会溢出连续范围的数字,并且您想检查哪些是整数,那么type(a) 可能不适合您。

解决方案:改用is_integer

a = 31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423.0
print('Type: ',type(a))
print('Is integer: ',a.is_integer()) 

第一个检查给你float,而另一个告诉你这个数字是整数。

【讨论】:

  • 这不是解决方案
  • 31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423.111.is_integer()True
【解决方案3】:

您可以使用 isinstance。这是一个例子:

a = 100
print(isinstance(a, int))

它将打印 TrueFalse 值取决于 a 变量的值类型(在这种情况下为 True以上)。

print(isinstance(a, float))

在上面的示例中,它将打印 False

【讨论】:

    【解决方案4】:

    length = (int) (math.log10(a) + 1); 将只返回整数的长度。

    在这里试试: https://onlinegdb.com/Sk1jmeTxV

    import math
    a= 31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423
    
    b = 31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423.111
    
    length = (int) (math.log10(a) + 1);
    
    if length ==len(str(abs(a))): 
       print ('is a perfect int');
    

    【讨论】:

      【解决方案5】:

      您可能会从输入或文件中以字符串形式获取数字,您可以使用十进制模块:

          import decimal
      
          ctx=decimal.Context(prec=200)
      
          b=decimal.Decimal("31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423.111")                                                                                                            
      
          print( ctx.divmod(b,1) ) 
          Out: Decimal('31231242354234534534534534534534534534534534535434645755453543543453534534534534534535345346756423423'), Decimal('0.111'))
      
          print(ctx.divmod(b,1)[1].is_zero())    # integer?                                                                               
          Out: False
      

      【讨论】:

        【解决方案6】:

        我想检查数字“x”的立方根是否为整数。

        求根的结果是一个浮点数。

        例如,应检查以下数字“y”:

        x = 12341254534XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        y = x**(1/3)  # y = cube root of x
        
        y = 6456535XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.2146544753325
        or
        y = 6456535XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.0
        or 
        y = 6456535XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.99999999999646546547
        

        这不适用于这些大数字。

        【讨论】:

          【解决方案7】:

          为什么不使用正则表达式?

          【讨论】:

            猜你喜欢
            • 2011-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-22
            • 2023-03-29
            • 1970-01-01
            相关资源
            最近更新 更多