Python 2.7:整数到最近的整数
我一直在试图将长浮点数如下所示:
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 # Debug
int(round(x))
将它舍入并将其更改为整数
编辑:
您不是将int(round(h))赋给任何variables。 当你调用int(round(h))时,它会返回整数,但是什么也不做; 您必须更改该行:
h = int(round(h))
将新值分配给h
使用round(x, y)
。 它会将您的号码四舍五入到您想要的小数位。
例如:
>>> round(32.268907563, 3) 32.269
round(value,significantDigit)
是普通的解决scheme,但是当数值以5
结尾的时候,mathangular度看,这种方法不能运行。 如果5
位于四舍五入后的数字之后,这些值有时只是按预期舍入(即8.005
舍入到两位十进制数字给出8.01
)。 由于浮点math的怪癖,对于某些值而言,它们被舍去了!
即
>>> round(1.0005,3) 1.0 >>> round(2.0005,3) 2.001 >>> round(3.0005,3) 3.001 >>> round(4.0005,3) 4.0 >>> round(1.005,2) 1.0 >>> round(5.005,2) 5.0 >>> round(6.005,2) 6.0 >>> round(7.005,2) 7.0 >>> round(3.005,2) 3.0 >>> round(8.005,2) 8.01
奇怪的。
假设你的意图是在传统的统计四舍五入科学,这是一个方便的包装,以获得round
函数按预期工作需要import
额外的东西,如Decimal
。
>>> round(0.075,2) 0.07 >>> round(0.075+10**(-2*5),2) 0.08
啊哈! 所以基于这个我们可以做一个function…
def roundTraditional(val,digits): return round(val+10**(-len(str(val))-1))
基本上这增加了一个值,保证比你试图使用的string的最小给定数字更小。 通过添加这个小数量,它在大多数情况下保留了round
的行为,而现在确保如果数字低于被四舍五入的那个数字是5
舍5
入的,并且如果它是四舍五入的话。
使用10**(-len(val)-1)
是有意的,因为它是您可以添加的最大的小数来强制转换,同时也确保您添加的值从不改变舍入,即使小数.
不见了。 我可以只使用10**(-len(val))
和condiditional if (val>1)
来减去1
以上…但是总是减去1
会更简单,因为这不会改变适用的范围十进制数字这种解决方法可以正确处理。 如果你的值达到了types的限制,这种方法将失败,这将失败,但几乎所有的有效小数值的范围,它应该工作。
您也可以使用小数点库来实现这一点,但是我提出的包装器更简单,在某些情况下可能是首选。
编辑:谢谢Blckknght指出, 5
条纹情况只发生在某些值。 也是这个答案的早期版本不够明确, 只有当数字直接低于你正在四舍五入的数字有一个5
时奇怪的舍入行为发生 。
对于积极的,尝试
int(x + 0.5)
为了使它也适用于底片,请尝试
int(x + (0.5 if x > 0 else -0.5))
int()
工作方式就像一个floor函数,因此你可以利用这个属性。 这绝对是最快的方法。
正如IEEE 754所规定的那样,Python不仅仅能够完成一半的工作吗?
小心重新定义,或使用“非标准”舍入…
如果你需要(例如)A的两位数近似值,那么int(A*100+0.5)/100.0
将会做你正在寻找的东西。
如果需要三位数近似乘以除以1000等等。
假设你正在使用python3.x,你也可以使用numpy
import numpy as np x = 2.3 print(np.rint(x)) >>> 2.0