我一直在寻找几个小时,但我找不到一种简单的方法来完成以下任务。
Value 1 = 0.00531
Value 2 = 0.051959
Value 3 = 0.0067123
我希望将每个值递增一个最小的小数点(但是,该数字必须保持小数点的精确位数,并且小数位数因每个值而异,因此我的麻烦)。
Value 1 should be: 0.00532
Value 2 should be: 0.051960
Value 3 should be: 0.0067124
有没有人知道在一个仍可以处理任意数量的小数的函数中完成上述操作的简单方法?
感谢。
答案 0 :(得分:2)
您是否看过标准模块decimal?
它规避了浮点行为。
只是为了说明可以做些什么。
import decimal
my_number = '0.00531'
mnd = decimal.Decimal(my_number)
print(mnd)
mnt = mnd.as_tuple()
print(mnt)
mnt_digit_new = mnt.digits[:-1] + (mnt.digits[-1]+1,)
dec_incr = decimal.DecimalTuple(mnt.sign, mnt_digit_new, mnt.exponent)
print(dec_incr)
incremented = decimal.Decimal(dec_incr)
print(incremented)
打印
0.00531
DecimalTuple(sign=0, digits=(5, 3, 1), exponent=-5)
DecimalTuple(sign=0, digits=(5, 3, 2), exponent=-5)
0.00532
或完整版(编辑后也带有任何数字,因此它也适用于'0.199'
)...
from decimal import Decimal, getcontext
def add_one_at_last_digit(input_string):
dec = Decimal(input_string)
getcontext().prec = len(dec.as_tuple().digits)
return dec.next_plus()
for i in ('0.00531', '0.051959', '0.0067123', '1', '0.05199'):
print(add_one_at_last_digit(i))
打印
0.00532
0.051960
0.0067124
2
0.05200
答案 1 :(得分:0)
正如其他评论者所指出的那样:您不应该使用floats
,因为给定的数字0.1234
会转换为内部表示形式,您无法按照自己的方式进一步处理它。这是故意模糊的。浮点本身就是一个主题。 This article非常好地解释了这个主题,并且是该主题的一个很好的入门读物。
那就是说,可以做的是将输入作为字符串(例如,在从输入读取时不要将其转换为float)。然后你可以这样做:
from decimal import Decimal
def add_one(v):
after_comma = Decimal(v).as_tuple()[-1]*-1
add = Decimal(1) / Decimal(10**after_comma)
return Decimal(v) + add
if __name__ == '__main__':
print(add_one("0.00531"))
print(add_one("0.051959"))
print(add_one("0.0067123"))
print(add_one("1"))
打印
0.00532
0.051960
0.0067124
2
<强>更新强>:
如果您需要对浮动进行操作,您可以尝试使用模糊逻辑进行近距离演示。 decimal
提供normalize
函数,可让您降级十进制表示的精度,使其与原始数字匹配:
from decimal import Decimal, Context
def add_one_float(v):
v_normalized = Decimal(v).normalize(Context(prec=16))
after_comma = v_normalized.as_tuple()[-1]*-1
add = Decimal(1) / Decimal(10**after_comma)
return Decimal(v_normalized) + add
但请注意16
的精确度纯粹是实验性的,您需要使用它来查看它是否产生了预期的结果。如果您需要正确的结果,则无法采用此路径。