检查float是否等同于python中的整数值

新手上路,请多包涵

在 Python 3 中,我正在检查给定值是否为三角形,也就是说,对于某个正整数,它可以表示为 n * (n + 1) / 2 n

我可以只写:

 import math

def is_triangular1(x):
    num = (1 / 2) * (math.sqrt(8 * x + 1) - 1)
    return int(num) == num

还是我需要在公差范围内进行检查?

 epsilon = 0.000000000001
def is_triangular2(x):
    num = (1 / 2) * (math.sqrt(8 * x + 1) - 1)
    return abs(int(num) - num) < epsilon

我检查了这两个函数是否返回相同的结果 x 最多 1,000,000。但我不确定一般来说 int(x) == x 是否总是能正确地确定一个数字是否为整数,因为在某些情况下,例如 5 表示为 4.99999999999997 等。

据我所知,如果我在 C 中执行,则第二种方法是正确的,但我不确定 Python 3。

原文由 Sunny88 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
2 个回答

你会想要做后者。在 Programming in Python 3 中给出了以下示例作为比较的最准确方法

def equal_float(a, b):
    #return abs(a - b) <= sys.float_info.epsilon
    return abs(a - b) <= chosen_value #see edit below for more info

此外,由于 epsilon 是“机器可以区分两个浮点数的最小差异”,因此您需要在函数中使用 <= 。

编辑:阅读下面的评论后,我回头看了看这本书,它专门说“这是一个简单的函数,用于比较浮点数是否等于机器精度的极限”。我相信这只是一个将浮点数与极端精度进行比较的例子,但事实上许多浮点数计算都会引入错误,这应该很少被使用。我将其描述为我的答案中“最准确”的比较方式,这在某种意义上是正确的,但在将浮点数或整数与浮点数进行比较时很少有意图。根据函数的“问题域”而不是使用 sys.float_info.epsilon 选择一个值(例如:0.00000000001)是正确的方法。

感谢 S.Lott 和 Sven Marnach 的更正,如果我误导了任何人,我深表歉意。

原文由 Dan Roberts 发布,翻译遵循 CC BY-SA 3.0 许可协议

python float类型中有 is_integer 函数:

 >>> float(1.0).is_integer()
True
>>> float(1.001).is_integer()
False
>>>

原文由 ndpu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题