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

Sun*_*y88 22 python floating-point

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

我可以写一下:

import math
def is_triangular1(x):
    num=(1/2) * (math.sqrt(8*x+1)-1 )
    return int(num)==num
Run Code Online (Sandbox Code Playgroud)

或者我需要这样做吗?:

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

我检查了两个函数返回x的相同结果,最多为1,000,000.但我不确定一般来说int(x)== x将始终正确地确定一个数是否是整数,因为例如5的情况表示为4.99999999999997等.

据我所知,第二种方法是正确的,如果我用C语言,但我不确定Python 3.

ndp*_*dpu 32

is_integerpython float类型中有函数:

>>> float(1.0).is_integer()
True
>>> float(1.001).is_integer()
False
>>> 
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 10

你的实现都有问题.实际上你可能会遇到类似的事情4.999999999999997,因此使用int()不是一种选择.

我会采用一种完全不同的方法:首先假设你的数字是三角形的,并计算n那种情况下的情况.在第一步中,你可以慷慨地回合,因为如果数字实际上三角形的话,只需要得到正确的结果.接下来,n * (n + 1) / 2为此计算n,并将结果与​​之比较x.现在,您正在比较两个整数,因此没有任何不准确之处.

n通过扩展可以简化计算

(1/2) * (math.sqrt(8*x+1)-1) = math.sqrt(2 * x + 0.25) - 0.5
Run Code Online (Sandbox Code Playgroud)

并利用它

round(y - 0.5) = int(y)
Run Code Online (Sandbox Code Playgroud)

为积极的y.

def is_triangular(x):
    n = int(math.sqrt(2 * x))
    return x == n * (n + 1) / 2
Run Code Online (Sandbox Code Playgroud)


Dan*_*rts 9

你会想做后者.在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
Run Code Online (Sandbox Code Playgroud)

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

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

感谢S.Lott和Sven Marnach的更正,如果我带领任何人走错路,我会道歉.

  • 一半.不要使用`sys.float_info.epsilon`.使用特定于问题域的值. (5认同)
  • @ S-Lott为什么不sys.float_info.epsilon? (2认同)

Pau*_*ite 5

Python中确实有一个Decimal类(在decimal模块),你可以用它来避免花车的不精确.