这是一个非常简单的问题。让我们来表示以下内容:
>>> x = 1.2876
现在,round
有一个非常可选的第二个参数,它将在该小数位上舍入:
>>> round(x,3)
1.288
我想知道是否有一种简单的方法来舍入数字。 math.floor(x,3)
返回错误而不是1.287
答案 0 :(得分:3)
这可能是最简单的,如果通过“向下舍入”你的意思是“朝向负无穷大”(如floor()
那样):
>>> x = 1.2876
>>> x - x % .001
1.287
>>> x = -1.1111
>>> x - x % .001
-1.112
但是,由于大多数十进制值无法准确表示为二进制浮点值,因此很容易出现大量的意外情况。如果那些打扰你,请改为使用decimal.Decimal
值来做类似的事情。
答案 1 :(得分:2)
总是floor(x*10**3)*10**-3
。
答案 2 :(得分:2)
这只是出现在我脑海中的东西。为什么我们不将它转换为字符串,然后将其转换为它?
import math
def floor_float(x, index):
sx = str(x)
sx = sx[:index]+str(math.floor(float(sx[index]+"."+sx[index+1])))
return float(sx)
一个小优点是它更具代表性 - 防错,它在表示数字方面更准确(因为它是一个字符串):
>>> floor_float(10.8976540981, 8)
10.897654
这可能不是最好的pythonic解决方案..但它运作得很好:))
更新
在Python 2.x中,math.floor
返回一个浮点而不是整数。为了使这项工作,您将结果转换为整数:
sx = sx[:index]+str(int(math.floor(float(sx[index]+"."+sx[index+1]))))
<强> UPDATE2 强>
老实说,上面的代码基本上是无稽之谈,太复杂了;)
因为它是地板,你可以截断字符串,然后将其浮起来:
def floor_float(x, i):
return float(str(x)[:i])
答案 3 :(得分:2)
另一种方法,建立在decimal
模块更精细的设施之上。与内置round()
一样,这也支持负“数字”:
>>> round(1234.5, -1) # builtin behavior for negative `ndigits`
1230.0
>>> round(1234.5, -2)
1200.0
>>> round(1234.5, -3)
1000.0
您可以使用decimal
中定义的8种(!)舍入模式中的任何一种。
from decimal import ROUND_DOWN
def rfloat(x, ndigits=0, rounding=ROUND_DOWN):
from decimal import Decimal as D
proto = D("1e%d" % -ndigits)
return float(D(str(x)).quantize(proto, rounding))
示例:
for i in range(-4, 6):
print i, "->", rfloat(-55555.55555, i)
产生
-4 -> -50000.0
-3 -> -55000.0
-2 -> -55500.0
-1 -> -55550.0
0 -> -55555.0
1 -> -55555.5
2 -> -55555.55
3 -> -55555.555
4 -> -55555.5555
5 -> -55555.55555
尝试解析字符串而不管风险; - )
答案 4 :(得分:1)
def roundDown(num, places):
return int(num*(10**places))/float(10**places)