如何在Python中加一个浮点数?

时间:2013-08-07 01:40:53

标签: python

是否有一种简单而直接的方法可以在Python中的浮点数中添加'one'?

我的意思是:

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。

3 个答案:

答案 0 :(得分: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')

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

缺点是使用Decimal会使plus函数比使用浮点运算慢约20-30倍,但这是精确度的代价。

答案 1 :(得分:2)

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

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

  2. 在放大的数字中添加一个。

  3. 除以之前的乘数。

  4. 所以看起来像:

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

    修改

    在上一个脚本中,当数字很长时出现问题。结果被str()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)
    

答案 2 :(得分:0)

n = n + 1/10**(len(repr(n)) - 2)