舍入到最接近的整数

van*_*ath 194 python

我一直试图围绕长浮点数,如:

32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...
Run Code Online (Sandbox Code Playgroud)

到目前为止没有成功.我试过了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)
Run Code Online (Sandbox Code Playgroud)

fra*_*ima 312

int(round(x))
Run Code Online (Sandbox Code Playgroud)

将它舍入并将其更改为整数

编辑:

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

h = int(round(h))
Run Code Online (Sandbox Code Playgroud)

要将新值分配给h

  • 如果你想要一个整数,那么在 Python 3.6.2 中“round(x)”就足够了(也许更低的版本也可以)。结果已经是int类型了。注意:“round(x, n)”的类型为 float。 (4认同)
  • print(“ 4.5)”,int(round(4.5)))#给了我4 print(“ 5.5)”,int(round(5.5)))#给了我6:,( (2认同)
  • 嗯。。。如果round函数没有将int转换为float,那就太好了。 (2认同)
  • proper_round(19.5) 对于自定义函数的两个版本都给出了非常错误的答案。对于第一个版本,它返回 110.0,对于第二个版本,它返回 11.0 (2认同)

小智 21

使用round(x, y).它会将您的数字向上舍入到您想要的小数位.

例如:

>>> round(32.268907563, 3)
32.269
Run Code Online (Sandbox Code Playgroud)

  • 在较新版本的 python 中,使用“round(x)”将返回一个整数(“>=3.6”) (2认同)

Jas*_*ick 18

round(value,significantDigit)是普通的解决方案,但是当圆形值结束时,这不会像数学角度那样运算5.如果在5您四舍五入的数字之后的数字中,这些值有时仅按预期向上8.005舍入(即舍入到两位小数8.01).对于由于浮点数学的怪癖而导致的某些值,它们会向下舍入!

>>> 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
Run Code Online (Sandbox Code Playgroud)

奇怪的.

假设你的意图是对科学中的统计进行传统的舍入,这是一个方便的包装器,可以使round函数按预期工作,需要import额外的东西Decimal.

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*5),2)

0.08
Run Code Online (Sandbox Code Playgroud)

啊哈!所以基于此我们可以做一个功能......

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)
Run Code Online (Sandbox Code Playgroud)

基本上,这会增加一个值,保证小于您尝试使用的字符串的最小给定数字round.round在大多数情况下,通过添加少量它保留了它的行为,同时现在确保数字低于被舍入的数字是否5向上舍入,如果它4向下舍入.

使用的方法10**(-len(val)-1)是故意的,因为它是你可以添加的最大的小数字来强制转换,同时还确保你添加的值永远不会改变舍入,即使.缺少小数.我可以使用10**(-len(val))一个condiditional if (val>1)来减去1更多...但更简单的是总是减去1因为这不会改变这个解决方法可以正确处理的十进制数的适用范围.如果您的值达到类型的限制,此方法将失败,这将失败,但对于几乎整个有效小数值范围,它应该起作用.

您也可以使用十进制库来完成此任务,但我建议的包装器更简单,在某些情况下可能更受欢迎.


编辑:感谢Blckknght指出5边缘情况仅针对某些值发生.此答案的早期版本也不够明确,只有当数字紧靠您正在四舍五入的数字时才会出现5奇数舍入行为.


Con*_*use 13

对于积极因素,请尝试

int(x + 0.5)
Run Code Online (Sandbox Code Playgroud)

为了使它也适用于负片,请尝试

int(x + (0.5 if x > 0 else -0.5))
Run Code Online (Sandbox Code Playgroud)

int()就像楼层功能一样,因此你可以利用这个属性.这绝对是最快的方式.

  • 不适用于否定`>>> x = -0.999``>>> int(x),round(x),int(x + 0.5)``(0,-1.0,0)` (4认同)
  • 如果您关心极端情况,请不要使用“添加 0.5 和地板”技术——有些值可能与您期望的不同!请参阅 /sf/answers/3311180981/ 以了解 C++ 和 /sf/answers/2712081851/ 在这个问题中的答案。 (3认同)

Map*_*pio 10

根据IEEE 754的规定,不只是Python做了一半甚至一半吗?

小心重新定义,或使用"非标准"舍入...

(另见/sf/answers/2311396391/)

  • 这个答案还不清楚。“舍入到偶数”绝对不是IEEE 754规定的,而是仅是几个舍入选项中的一个(由标准描述)(https://en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest)。也可以选择“四舍五入到零”(即大多数人期望的行为),它是C / C ++中的默认值。 (2认同)

sus*_*mit 7

您也可以使用numpy,假设您正在使用python3.x,这是一个示例

import numpy as np
x = 2.3
print(np.rint(x))
>>> 2.0
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 5

您的解决方案是在不指定第二个参数(小数位数)的情况下调用round

>>> round(0.44)
0
>>> round(0.64)
1
Run Code Online (Sandbox Code Playgroud)

这比一个更好的结果

>>> int(round(0.44, 2))
0
>>> int(round(0.64, 2))
0
Run Code Online (Sandbox Code Playgroud)

https://docs.python.org/3/library/functions.html#round的Python文档中

舍入(数字[,n位数字])

返回数字舍入到小数点后的n位精度。如果省略ndigits或为None,它将返回最接近其输入的整数。

注意

针对float的round()行为可能令人惊讶:例如,round(2.675,2)给出2.67,而不是预期的2.68。这不是错误:这是由于大多数十进制小数不能完全表示为浮点数的结果。有关更多信息,请参见浮点算法:问题和限制。