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的行为,而现在确保如果数字低于被四舍五入的那个数字是55入的,并且如果它是四舍五入的话。

使用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不仅仅能够完成一半的工作吗?

小心重新定义,或使用“非标准”舍入…

(另请参见https://stackoverflow.com/a/33019948/109839

如果你需要(例如)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