我一直在尝试四舍五入长浮点数,例如:
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 许可协议
TL;博士:
将四舍五入并将其更改为整数。
您没有将
round(h)
分配给任何变量。当您调用round(h)
时,它返回整数但不执行任何其他操作;您必须将该行更改为:将新值分配给
h
。正如@plowman 在评论中所说,Python 的
round()
不像人们通常期望的那样工作,这是因为数字作为变量存储的方式通常不是你在屏幕上看到的方式。有 很多答案 可以解释这种行为。避免此问题的一种方法是使用 此答案 所述的小数。
为了让这个答案在不使用额外库的情况下正常工作,使用自定义舍入函数会很方便。我想出了以下解决方案,据我测试,它避免了所有存储问题。它基于使用字符串表示,通过
repr()
获得(不是str()
!)。它看起来很老套,但这是我发现解决所有问题的唯一方法。它适用于 Python2 和 Python3。测试:
最后,正确的答案是:
测试:
这里的问题是
dec
-th 十进制可以是 9,如果dec+1
-th digit >=5 9 将变成 0 并且 1 应该被带到dec-1
第位数。如果我们考虑到这一点,我们会得到:
In the situation described above
b = 10
and the previous version would just concatenatea
andb
which would result in a concatenation of10
where the尾随 0 会消失。此版本将b
转换为基于dec
--- 的右小数位,作为正确的进位。