4

这是一个非常简单的问题。让我们表示以下内容:

>>> x = 1.2876

现在,round有一个很棒的可选第二个参数,它将在那个小数位处四舍五入:

>>> round(x,3)
1.288

我想知道是否有一种简单的方法来四舍五入。math.floor(x,3)返回错误而不是1.287

4

5 回答 5

3

这可能是最简单的,如果“四舍五入”是指“向负无穷大”(就像floor()这样):

>>> x = 1.2876
>>> x - x % .001
1.287
>>> x = -1.1111
>>> x - x % .001
-1.112

但是,这很容易引起很多肤浅的意外,因为大多数十进制值不能精确地表示为二进制浮点值。decimal.Decimal如果这些困扰您,请使用值做类似的事情。

于 2013-10-25T02:39:34.817 回答
2

另一种方法,建立在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

尝试解析字符串,风险自负;-)

于 2013-10-25T19:33:31.933 回答
2

总是有的floor(x*10**3)*10**-3

于 2013-10-25T02:36:49.960 回答
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]))))

更新2

老实说,上面的代码基本上是胡说八道,太复杂了;)

由于它是地板,您可以截断字符串,然后将其浮动:

def floor_float(x, i):
    return float(str(x)[:i])
于 2013-10-25T02:45:19.640 回答
1
def roundDown(num, places):
    return int(num*(10**places))/float(10**places)
于 2013-10-25T02:38:09.983 回答