Python - 舍入到最接近的整数

时间:2017-03-19 08:21:28

标签: python floating-point integer

我一直在努力解决这个问题,但没有运气。我需要将每个系数舍入到最接近的整数。

为此我引入一个小数dq = 0.0001。如果a [0] = 0.5,则round(a [0])= 0.0;这显然不好。但是,要解决这个问题,请介绍dq:round(a [0] + dq)= round(0.5001)= 1.0;这很好。

对于负数,例如[2] = -0.5:round(a [2] -dq)= round(-0.5001)= -1.0。我考虑使用if语句的否定。这是我的代码,它没有返回正确的值:

a= 0.5,0.5,-0.5,-0.5
dq = 0.0001 #small number

b = round(a[0]+dq), round(a[1]+dq), round(a[2]+dq), round(a[3]+dq)

if a[0] < 0:
    b[0] == round(a[0]-dq)
if a[1] < 0:
    b[1] == round(a[1]-dq)
if a[2] < 0:
    b[2] == round(a[2]-dq)
if a[3] < 0:
    b[3] == round(a[3]-dq)

print(b)

输出:

(1,1,0,0)

显然,if语句是功能失调的。

P.S。我需要能够在以后的计算中使用结果b。

3 个答案:

答案 0 :(得分:1)

也许你可以使用像

这样的东西
a = [0.5, 0.5, -0.5, -0.5]
print(list(map(lambda v: int(round(v + (dq if v > 0 else -dq))), a)))

这会产生

[1, 1, -1, -1]

然而,另一种选择是:

x = 0.49999 #just slightly less than 0.5
round(x)
>>> 0.0

#first round to 2 digits and then to an "integer"
round(round(x, 2))
>>> 1.0

答案 1 :(得分:0)

你可以用更聪明的方式做到这一点,但这里是你问题的快速解决方案。首先,使用for循环来舍入a的元素。顺便说一下,a是一个元组,所以你可以遍历它的元素。

其次,你的逻辑是错误的。如果a的元素为正,即> 0,则应添加dq而不是减去,正如您自己提到的那样。

In [53]: for i in a:
    ...:     if i < 0:
    ...:         print(round(i-dq))
    ...:     else:
    ...:         print(round(i+dq))
    ...:         
    ...:         
1.0
1.0
-1.0
-1.0

答案 2 :(得分:0)

如果我正确理解您的问题,您希望将负数舍入到最接近的整数,将正数舍入到最接近的整数。如果是这种情况,您可以使用math.ceilmath.floor

import math

def my_round(x):
    if x < 0:
        return math.floor(x)
    if x >= 0:
        return math.ceil(x)


my_round(0.5) # 1
my_round(-0.5) # -1