将数字四舍五入到最接近的整数

新手上路,请多包涵

我一直在尝试四舍五入长浮点数,例如:

 32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...

到目前为止没有成功。我试过 math.ceil(x)math.floor(x) (虽然这会向上或向下舍入,这不是我要找的)和 round(x) 这也不起作用(仍然是浮点数)。

我能做什么?

代码:

 for i in widthRange:
    for j in heightRange:
        r, g, b = rgb_im.getpixel((i, j))
        h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
        h = h * 360
        int(round(h))
        print(h)

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

阅读 785
2 个回答

TL;博士:

 round(x)

将四舍五入并将其更改为整数。

您没有将 round(h) 分配给任何变量。当您调用 round(h) 时,它返回整数但不执行任何其他操作;您必须将该行更改为:

 h = round(h)

将新值分配给 h


正如@plowman 在评论中所说,Python 的 round() 不像人们通常期望的那样工作,这是因为数字作为变量存储的方式通常不是你在屏幕上看到的方式。有 很多答案 可以解释这种行为。

避免此问题的一种方法是使用 此答案 所述的小数。

为了让这个答案在不使用额外库的情况下正常工作,使用自定义舍入函数会很方便。我想出了以下解决方案,据我测试,它避免了所有存储问题。它基于使用字符串表示,通过 repr() 获得(不是 str() !)。它看起来很老套,但这是我发现解决所有问题的唯一方法。它适用于 Python2 和 Python3。

 def proper_round(num, dec=0):
    num = str(num)[:str(num).index('.')+dec+2]
    if num[-1]>='5':
        return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))
    return float(num[:-1])

测试:

 >>> print(proper_round(1.0005,3))
1.001
>>> print(proper_round(2.0005,3))
2.001
>>> print(proper_round(3.0005,3))
3.001
>>> print(proper_round(4.0005,3))
4.001
>>> print(proper_round(5.0005,3))
5.001
>>> print(proper_round(1.005,2))
1.01
>>> print(proper_round(2.005,2))
2.01
>>> print(proper_round(3.005,2))
3.01
>>> print(proper_round(4.005,2))
4.01
>>> print(proper_round(5.005,2))
5.01
>>> print(proper_round(1.05,1))
1.1
>>> print(proper_round(2.05,1))
2.1
>>> print(proper_round(3.05,1))
3.1
>>> print(proper_round(4.05,1))
4.1
>>> print(proper_round(5.05,1))
5.1
>>> print(proper_round(1.5))
2.0
>>> print(proper_round(2.5))
3.0
>>> print(proper_round(3.5))
4.0
>>> print(proper_round(4.5))
5.0
>>> print(proper_round(5.5))
6.0
>>>
>>> print(proper_round(1.000499999999,3))
1.0
>>> print(proper_round(2.000499999999,3))
2.0
>>> print(proper_round(3.000499999999,3))
3.0
>>> print(proper_round(4.000499999999,3))
4.0
>>> print(proper_round(5.000499999999,3))
5.0
>>> print(proper_round(1.00499999999,2))
1.0
>>> print(proper_round(2.00499999999,2))
2.0
>>> print(proper_round(3.00499999999,2))
3.0
>>> print(proper_round(4.00499999999,2))
4.0
>>> print(proper_round(5.00499999999,2))
5.0
>>> print(proper_round(1.0499999999,1))
1.0
>>> print(proper_round(2.0499999999,1))
2.0
>>> print(proper_round(3.0499999999,1))
3.0
>>> print(proper_round(4.0499999999,1))
4.0
>>> print(proper_round(5.0499999999,1))
5.0
>>> print(proper_round(1.499999999))
1.0
>>> print(proper_round(2.499999999))
2.0
>>> print(proper_round(3.499999999))
3.0
>>> print(proper_round(4.499999999))
4.0
>>> print(proper_round(5.499999999))
5.0

最后,正确的答案是:

 # Having proper_round defined as previously stated
h = int(proper_round(h))


测试:

 >>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1  # should be 7

这里的问题是 dec -th 十进制可以是 9,如果 dec+1 -th digit >=5 9 将变成 0 并且 1 应该被带到 dec-1 第位数。

如果我们考虑到这一点,我们会得到:

 def proper_round(num, dec=0):
    num = str(num)[:str(num).index('.')+dec+2]
    if num[-1]>='5':
      a = num[:-2-(not dec)]       # integer part
      b = int(num[-2-(not dec)])+1 # decimal part
      return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))
    return float(num[:-1])

In the situation described above b = 10 and the previous version would just concatenate a and b which would result in a concatenation of 10 where the尾随 0 会消失。此版本将 b 转换为基于 dec --- 的右小数位,作为正确的进位。

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

使用 round(x, y) 。它会将您的数字四舍五入到您想要的小数位。

例如:

 >>> round(32.268907563, 3)
32.269

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

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