我一直在尝试将长浮点数四舍五入,比如:
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)
将其舍入并将其更改为整数
编辑:
您没有将int(round(h))赋值给任何变量。当您调用int(round(h))时,它返回整数,但不执行其他操作;您必须将该行更改为:
将新值赋给h
编辑2:
正如@prowleman在评论中所说,Python的
round()
并不像人们通常期望的那样工作,这是因为数字作为变量存储的方式通常不是您在屏幕上看到的方式。有很多答案可以解释这种行为:round() in Python doesn't seem to be rounding properly
避免这个问题的一种方法是使用这个答案中的小数:https://stackoverflow.com/a/15398691/4345659
为了使这个答案在不使用额外库的情况下正常工作,可以方便地使用自定义舍入函数。经过大量修改,我提出了以下解决方案,只要我测试,就避免了所有的存储问题。它基于使用字符串表示,通过
repr()
(而不是str()
!)获得。它看起来很粗糙,但这是我找到的解决所有案件的唯一方法。它同时适用于Python2和Python3。测试:
最后,正确的答案是:
编辑3:
测试:
这里的问题是,第
dec
个十进制数可以是9,如果第dec+1
个数字>;=5,9将变成0,1应该被带到第dec-1
个数字。如果我们考虑到这一点,我们会得到:
在上面描述的情况下,
b = 10
和上一个版本将只连接a
和b
,这将导致10
的连接,其中尾随的0将消失。此版本将b
转换为基于dec
的右小数位,作为适当的进位。round(value,significantDigit)
是普通的解决方案,但是当以5
结尾的舍入值结束时,从数学的角度来看,这并不像预期的那样操作。如果5
在您四舍五入后的数字中,则这些值有时只按预期进行四舍五入(即8.005
四舍五入到两个十进制数字表示8.01
)。对于某些由于浮点数学的怪癖而产生的值,它们将被舍入!即
很奇怪。
假设您的目的是对科学中的统计数据进行传统的舍入,那么这是一个方便的包装器,可以让
round
函数按预期工作,需要import
额外的东西,比如Decimal
。啊哈!所以基于这个我们可以做一个函数。。。
基本上,这会添加一个值,该值保证小于尝试对其使用
round
的字符串的最小给定数字。在大多数情况下,通过添加这个小数量,它会保留round
的行为,同时现在确保低于被舍入到的数字的位数是5
它会向上舍入,如果是4
它会向下舍入。使用
10**(-len(val)-1)
的方法是经过深思熟虑的,因为它是您可以添加以强制移位的最大小数值,同时还确保添加的值永远不会更改舍入,即使缺少小数.
。我可以用10**(-len(val))
和条件if (val>1)
来减去1
更多。。。但是总是减去1
比较简单,因为这不会改变这个解决方案能够正确处理的十进制数的适用范围。如果您的值达到类型的限制,这种方法将失败,但对于几乎所有有效的十进制值范围,它都应该起作用。您也可以使用decimal库来实现这一点,但我建议的包装器更简单,在某些情况下可能更受欢迎。
编辑:感谢Blckknght指出
5
边缘情况只发生在某些值上。此外,这个答案的早期版本不够明确,只有当紧靠要舍入到的数字下面的数字有5
时,才会出现奇数舍入行为。使用
round(x, y)
。它会把你的数字四舍五入到你想要的小数位。例如:
相关问题 更多 >
编程相关推荐