我一直在尝试四舍五入长浮点数,例如:
32.268907563; 32.268907563; 31.2396694215; 33.6206896552; ...
到目前为止没有成功。我试过math.ceil(x), math.floor(x)(虽然这会向上或向下舍入,这不是我想要的)并且round(x)也没有工作(仍然是浮点数)。
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)
TL;博士:
将四舍五入并将其更改为整数。
您没有分配round(h)给任何变量。当您调用 时round(h),它返回整数但不执行任何其他操作;您必须将该行更改为:
round(h)
h = round(h)
将新值分配给h。
h
正如@plowman 在评论中所说,Pythonround()不能正常工作,这是因为数字作为变量存储的方式通常不是你在屏幕上看到的方式。有很多答案可以解释这种行为。
round()
避免此问题的一种方法是使用此答案所述的小数。
如果您使用 Decimal 模块,您可以在不使用“round”函数的情况下进行近似。这是我一直在使用四舍五入的方法,尤其是在编写货币应用程序时:
from decimal import Decimal, ROUND_UP Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)
这将返回一个十进制数,即 16.20。
为了让这个答案在不使用额外库的情况下正常工作,使用自定义舍入函数会很方便。我想出了以下解决方案,据我测试,它避免了所有存储问题。它基于使用通过repr()(NOT str()!) 获得的字符串表示。它看起来很老套,但这是我发现解决所有问题的唯一方法。它适用于 Python2 和 Python3。
repr()
str()
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第 - 位小数可以是 9,如果dec+1第 - 位 > = 5,则 9 将变为 0,并且 1 应该被带到dec-1第 - 位。
dec
dec+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])
在上述情况下b = 10,以前的版本只会连接a,b这将导致10尾随 0 消失的位置连接。此版本b根据dec, 作为正确的进位转换到正确的小数位。
b = 10
a
b
10