这是一个非常简单的问题。让我们表示以下内容:
>>> x = 1.2876
现在,round
有一个很棒的可选第二个参数,它将在那个小数位处四舍五入:
>>> round(x,3)
1.288
我想知道是否有一种简单的方法来四舍五入。math.floor(x,3)
返回错误而不是1.287
这可能是最简单的,如果“四舍五入”是指“向负无穷大”(就像floor()
这样):
>>> x = 1.2876
>>> x - x % .001
1.287
>>> x = -1.1111
>>> x - x % .001
-1.112
但是,这很容易引起很多肤浅的意外,因为大多数十进制值不能精确地表示为二进制浮点值。decimal.Decimal
如果这些困扰您,请使用值做类似的事情。
另一种方法,建立在decimal
模块更复杂的设施上。像 builtin 一样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
.
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
尝试解析字符串,风险自负;-)
总是有的floor(x*10**3)*10**-3
。
这只是我脑海中浮现的一件事。我们为什么不把它转换成字符串,然后再落地呢?
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]))))
更新2
老实说,上面的代码基本上是胡说八道,太复杂了;)
由于它是地板,您可以截断字符串,然后将其浮动:
def floor_float(x, i):
return float(str(x)[:i])
def roundDown(num, places):
return int(num*(10**places))/float(10**places)