Python:将float 1.0返回为int 1,但将float 1.5返回为float 1.5

Ray*_*hen 26 python floating-point integer

在Python中,有一种方法可以1.0转换为整数,1而同一函数会忽略该整数1.5并将其保留为float

现在,int()1.0变成,1但也将1.5向下舍入到1,这不是我想要的。

Dir*_*Bit 79

继续以上评论:

使用is_integer()

来自docs的示例

>>> (1.5).is_integer()
False
>>> (1.0).is_integer()
True
>>> (1.4142135623730951).is_integer()
False
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
Run Code Online (Sandbox Code Playgroud)

输入

s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]
Run Code Online (Sandbox Code Playgroud)

因此

print([int(x) if x.is_integer() else x for x in s])
Run Code Online (Sandbox Code Playgroud)

包装功能:

def func(s):
    return [int(x) if x.is_integer() else x for x in s]

print(func(s))
Run Code Online (Sandbox Code Playgroud)

如果您不想要任何东西import

def func(s):
    return [int(x) if x == int(x) else x for x in s]

print(func(s))
Run Code Online (Sandbox Code Playgroud)

使用map()lambda功能和ITER s

print(list(map(lambda x: int(x) if x.is_integer() else x, s)))
Run Code Online (Sandbox Code Playgroud)

要么

print(list(map(lambda x: int(x) if int(x) == x else x, s)))
Run Code Online (Sandbox Code Playgroud)

输出

[1.5, 1, 2.5, 3.54, 1, 4.4, 2]
Run Code Online (Sandbox Code Playgroud)

  • @JoshDavis大约是取整为`1.0`与`1.0 + sys.float_info.epsilon`。 (24认同)
  • 如果有人对is_integer()的限制以及浮点数与1.0的距离有多远并且仍然可以将其视为整数感到好奇,我编写了一个简短的脚本来查找该限制。这是一个非常小的数字,比我以前任何时候都需要的精度更高。(1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656251e-16).is_integer()传回False,但(1.0 + 1.1102230246251566636831481088739149080825883254353483864385054857848444953560829162597656250e-16).is_integer()返回 (15认同)
  • @accdias:这也不总是有效的,因为`float`有代表性的限制,而`int`没有。传递x = 1 << 1024将导致您的代码因OverflowError死亡。因此,现在您已经对安全性或异常处理进行了其他检查。 (4认同)

Eri*_*nil 32

如果您的目标是将数字转换为简洁的字符串,则可以简单地使用'%g'(“常规格式”)进行格式化

>>> '%g' % 1.0
'1'
>>> '%g' % 1
'1'
>>> '%g' % 1.5
'1.5'
>>> '%g' % 0.3
'0.3'
>>> '%g' % 0.9999999999
'1'
Run Code Online (Sandbox Code Playgroud)

您可以指定所需的精度:

>>> '%.15g' % 0.999999999999999
'0.999999999999999'
>>> '%.2g' % 0.999
'1'
Run Code Online (Sandbox Code Playgroud)

  • @DirtyBit:您可以指定所需的精度:''%.15g'%0.999999999999999'是''0.999999999999999'`,''%。2g'%0.999'是''1'。从此[文章](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html):*舍入误差是浮点计算的特征*。 (2认同)
  • 最佳答案,因为这是OP想要的唯一有效用例。 (2认同)

U10*_*ard 13

float.is_integer 是浮点数的方法,该方法返回浮点数是否表示整数。

您可以只使用我称为的函数to_int,该函数is_integer用于检查它是否表示整数1.0(例如1.5)。

如果它代表整数,则返回int(a),否则只需返回其原始值即可。

如您所见,我没有使用elifelse因为return仅返回一次:

def to_int(a):
   if a.is_integer():
      return int(a)
   return a

print(to_int(1.5))
print(to_int(1.0))
Run Code Online (Sandbox Code Playgroud)

输出:

1.5
1
Run Code Online (Sandbox Code Playgroud)


Sil*_*olo 5

Python 浮点数是近似值,因此打印as 的1.0内容不一定完全是1.0. 如果您想查看某个值是否近似为整数,请使用足够小的 epsilon 值。

EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

def func(x):
  if abs(x - round(x)) < EPSILON:
    return round(x)
  else:
    return x
Run Code Online (Sandbox Code Playgroud)

一般而言,如果您正在检查浮点数是否==指向某事物,这往往是代码异味,因为浮点值本质上是近似的。通常更适合检查浮点数是否在某个 epsilon 范围内靠近某物。

  • 虽然大多数浮点值都是近似值,但有许多整数可以精确表示。64 位 IEEE 754 浮点数(在 Python 和其他语言中使用)可以准确地表示适合 53 位或更少的任何有符号整数。假设整数值可以用少至 53 位表示,这样的整数可以在 64 位浮点数和 64 位整数之间进行 1 到 1 的转换。根据 IEEE 754 规范,保持在 53 位整数空间内的加法、减法和乘法应产生相同的结果。 (5认同)