14

是否有一种简单直接的方法可以在 Python 中的浮点数处添加“一”?

我的意思是:

if a == 0.0143:
    a = plus(a)
    assert a == 0.0144

def plus(a):
    sa = str(a)
    index = sa.find('.')
    if index<0:
        return a+1
    else:
        sb = '0'*len(sa)
        sb[index] = '.'
        sb[-1] = 1
        return a+float(sb)

这不是我想要的,因为它给了我 0.0144000000001。

4

3 回答 3

20

正如您所注意到的,并非所有十进制数都可以完全表示为浮点数:

>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal(0.2)
Decimal('0.200000000000000011102230246251565404236316680908203125')
>>> Decimal(0.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
>>> Decimal(0.5)
Decimal('0.5')

由于您正在使用十进制数的属性,因此请使用该decimal模块,它完全实现了它们:

from decimal import Decimal

def plus(n):
    return n + Decimal('10') ** n.as_tuple().exponent

还有一个演示:

>>> n = Decimal('0.1239')
>>> plus(n)
Decimal('0.1240')

您必须将数字表示为字符串,因为将其表示为浮点数会失去精度。

缺点是 usingDecimal将使您的plus函数比使用浮点运算慢 20-30 倍,但这是精度的代价。

于 2013-08-07T01:53:14.460 回答
2

Blender的答案绝对是一个很好的答案,但如果你坚持使用floats我相信这样做的简单方法是:

  1. 找出10 ** x可以将浮点数乘以整数的 x。

  2. 将放大的数字加一。

  3. 除以之前的乘数。

所以它看起来像:

n = 0.125
e = len(str(n)) - 2
temp_n = n * 10 ** e
temp_n += 1
n = temp_n / 10 ** e
print n

编辑:

在之前的脚本中,当数字很长时出现问题。结果被str()and截断print,所以我稍微改变了脚本:

n = 0.1259287345982795
e = len(repr(n)) - 2
temp_n = n * 10 ** e
temp_n += 1
n = temp_n / 10 ** e
print repr(n)
于 2013-08-07T02:05:23.090 回答
0
n = n + 1/10**(len(repr(n)) - 2)
于 2013-08-07T02:31:23.577 回答