Python - 地板浮动

时间:2013-10-25 02:29:55

标签: python math floor

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

>>> x = 1.2876

现在,round有一个非常可选的第二个参数,它将在该小数位上舍入:

>>> round(x,3)
1.288

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

5 个答案:

答案 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)