python中floor()函数的意外值

时间:2012-02-14 17:59:34

标签: python

import numpy
import math

x = numpy.roots([2,-2,(21 - 21**2)])
print x[0], math.floor(x[0])

输出结果为:

15.0 14.0 

我希望

15.0 15.0

我认为没有任何理由让发言权等于14.0。请解释一下!

4 个答案:

答案 0 :(得分:2)

似乎x[0]略小于15,因此floor将值降低到14.根寻找算法是数字而不是符号,浮点运算不精确。

答案 1 :(得分:2)

浮点数只是某些值的近似值,并且所有计算都可能引入舍入错误。打印浮点数也可能会将数字四舍五入到更少的数字。尝试

print repr(x[0]), repr(math.floor(x[0]))

确保显示所有数字。我想它会显示类似14.9999999999999的内容。

答案 2 :(得分:2)

我之前使用过一个名为fAlmostEqual的函数,基于numpy的allclose函数:

import math

def fAlmostEqual(a, b, rtol=1.0000000000000001e-05, atol=1e-08):
    """Checks if the given floats are almost equal. Uses the algorithm
    from numpy.allclose."""
    return math.fabs(a - b) <= (atol + rtol * math.fabs(b))

基于此创建模糊楼层功能:

def fuzzyFloor(v):
    """Returns the floor of the given number, unless it is equal to its
    ceiling (within floating point error)."""
    floor = math.floor(v)
    if fAlmostEqual(floor+1, v):
        return floor+1
    return floor

print fuzzyFloor(14.9999999999999)
print fuzzyFloor(15)
print fuzzyFloor(14.99)
print fuzzyFloor(14.5)

打印:

15.0
15.0
14.0
14.0

答案 3 :(得分:0)

你的代码对我没有同样的意思:

>>> import numpy
>>> import math
>>>
>>> x = numpy.roots([2,-2,(21 - 21**2)])
>>> print x[0], math.floor(x[0])
15.0 15.0

然而,这里潜伏着14个人。这是其中一个根源:

>>> print x
[ 15. -14.]