如何检查浮点值是否为整数

2024-12-26 08:43:00
admin
原创
106
摘要:问题描述:我正在尝试寻找小于 12,000 的最大整数立方根。processing = True n = 12000 while processing: n -= 1 if n ** (1/3) == #checks to see if this has decimals or not 不过,...

问题描述:

我正在尝试寻找小于 12,000 的最大整数立方根。

processing = True
n = 12000
while processing:
    n -= 1
    if n ** (1/3) == #checks to see if this has decimals or not

不过,我不确定如何检查它是否是整数!我可以将其转换为字符串,然后使用索引来检查最终值并查看它们是否为零,但这似乎相当麻烦。有没有更简单的方法?


解决方案 1:

要检查浮点值是否为整数,请使用该float.is_integer()方法:

>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False

该方法已添加到floatPython 2.6 中的类型中。

考虑到在 Python 2 中,1/30(整数操作数的向下取整除法!),并且浮点运算可能不精确(afloat是使用二进制分数的近似值,而不是精确的实数)。但稍微调整一下循环,就会得到:

>>> for n in range(12000, -1, -1):
...     if (n ** (1.0/3)).is_integer():
...         print n
... 
27
8
1
0

这意味着由于前面提到的不精确,任何超过 3 的立方数(包括 10648)都被遗漏了:

>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996

您必须检查接近整数的数字,否则就不能使用它float()来查找数字。例如对 的立方根进行四舍五入12000

>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648

如果您使用的是 Python 3.5 或更新版本,则可以使用该math.isclose()函数查看浮点值是否在可配置的范围内:

>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True

对于旧版本,该函数的简单实现(跳过错误检查并忽略无穷大和 NaN)如PEP485 中所述:

def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
    return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

解决方案 2:

我们可以使用模数 (%) 运算符。这告诉我们用 x 除以 y 时有多少余数 - 表示为x % y。每个整数都必须除以 1,因此如果有余数,则它一定不是整数。

此函数将返回一个布尔值,TrueFalse,取决于是否n为整数。

def is_whole(n):
    return n % 1 == 0

解决方案 3:

你可以使用这个:

if k == int(k):
    print(str(k) + " is a whole number!")

解决方案 4:

您无需循环或检查任何内容。只需取 12,000 的立方根并将其向下舍入:

r = int(12000**(1/3.0))
print r*r*r # 10648

解决方案 5:

您可以对此使用模运算。

if (n ** (1.0/3)) % 1 != 0:
    print("We have a decimal number here!")

解决方案 6:

怎么样

if x%1==0:
    print "is integer"

解决方案 7:

测试立方根不是更容易吗?从 20(203 = 8000)开始,一直到 30(303 = 27000)。然后你必须测试少于 10 个整数。

for i in range(20, 30):
    print("Trying {0}".format(i))
    if i ** 3 > 12000:
        print("Maximum integral cube root less than 12000: {0}".format(i - 1))
        break

解决方案 8:

上述答案适用于许多情况,但也遗漏了一些情况。考虑以下几点:

fl = sum([0.1]*10)  # this is 0.9999999999999999, but we want to say it IS an int

以此为基准,其他一些建议并没有得到我们想要的行为:

fl.is_integer() # False

fl % 1 == 0     # False

尝试一下:

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

def is_integer(fl):
    return isclose(fl, round(fl))

现在我们得到:

is_integer(fl)   # True

isclose随Python 3.5+提供,对于其他 Python,您可以使用这个基本等效的定义(如相应的PEP中所述)

解决方案 9:

仅供参考,is_integer内部正在进行:

import math
isInteger = (math.floor(x) == x)

不完全是python,但是cpython实现是如上所述实现的。

解决方案 10:

您可以使用类似如下的方法:

num = 1.9899
bool(int(num)-num)
#returns True

如果为 True,则表示它包含一些值,因此不是整数。否则

num = 1.0
bool(int(num)-num)
# returns False

解决方案 11:

所有的答案都很好,但一个万无一失的方法是

def whole (n):
     return (n*10)%10==0

如果它是一个整数,则该函数返回 True,否则返回 False....我知道我有点晚了,但这是我制作的一个有趣的方法...

编辑:正如下面的评论所述,更便宜的等效测试是:

def whole(n):
    return n%1==0

解决方案 12:

>>> def is_near_integer(n, precision=8, get_integer=False):
...     if get_integer:
...         return int(round(n, precision))
...     else:
...         return round(n) == round(n, precision)
...
>>> print(is_near_integer(10648 ** (1.0/3)))
True
>>> print(is_near_integer(10648 ** (1.0/3), get_integer=True))
22
>>> for i in [4.9, 5.1, 4.99, 5.01, 4.999, 5.001, 4.9999, 5.0001, 4.99999, 5.000
01, 4.999999, 5.000001]:
...     print(i, is_near_integer(i, 4))
...
4.9 False
5.1 False
4.99 False
5.01 False
4.999 False
5.001 False
4.9999 False
5.0001 False
4.99999 True
5.00001 True
4.999999 True
5.000001 True
>>>

解决方案 13:

这个问题已经解决了,但我想提出一个额外的基于数学的函数解决方案。

这种方法的好处是它可以计算数字的整数部分,这可能对您的一般任务有益。

算法

  • 将数字的整数部分分解为小数部分的总和(例如327=3*100+2*10+7*1

  • 取计算出的整数与数字本身之间的差值

  • 决定差异是否足够接近以被视为整数。

from math import ceil, log, isclose

def is_whole(x: float) -> bool:
    n_digits = ceil(log(x,10)) # number of digits of decimals at or above ones
    digits = [(n//(10**i))%10 for i in range(n_digits)] # parse digits of `x` at or above ones decimal
    whole = 0 # will equal the whole number part of `x`
    for i in range(n_digits):
        decimal = 10**i
        digit = digits[i]
        whole += digit*decimal
    
    diff = whole - x
    return isclose(diff, 0.0)

注意:解析数字的想法是从这里实现的

解决方案 14:

尝试使用:

int(val) == val

它比任何其他方法都更精确。

解决方案 15:

您可以使用该round函数来计算该值。

是的,正如许多人指出的那样,在 Python 中,当我们计算立方根的值时,它会给出一个带有一点错误的输出。要检查该值是否为整数,您可以使用以下函数:

def cube_integer(n):
    if round(n**(1.0/3.0))**3 == n:
        return True
    return False

但请记住,int(n)相当于math.floor,因此,如果您找到,int(41063625**(1.0/3.0))您将得到 344 而不是 345。

int因此,使用立方根时请小心。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用