是否有一种简单而直接的方法可以在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。
答案 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
,我相信这样做的简单方法是:
找出10 ** x
的x,它可以将你的浮点数乘以整数。
在放大的数字中添加一个。
除以之前的乘数。
所以看起来像:
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)