Python按小数位数预先确定的可能的最小步长递增浮点数

glo*_*fit 6 python increment

我已经搜索了几个小时,但找不到完成以下任务的简单方法。

Value 1 = 0.00531
Value 2 = 0.051959
Value 3 = 0.0067123
Run Code Online (Sandbox Code Playgroud)

我想将每个值增加其最小的小数点(但是,该数字必须保持其开始时的精确小数位数,并且小数位数随每个值而变化,因此我很麻烦)。

Value 1 should be: 0.00532
Value 2 should be: 0.051960
Value 3 should be: 0.0067124
Run Code Online (Sandbox Code Playgroud)

有谁知道在仍然可以处理任意数量的小数的函数中完成上述任务的简单方法?

谢谢。

han*_*ast 2

正如其他评论者所指出的:您不应该进行操作floats,因为给定的数字0.1234会转换为内部表示形式,并且您无法按照您想要的方式进一步处理它。这是故意含糊其辞的。浮点数本身就是一个主题。本文很好地解释了该主题,并且是该主题的良好入门读物。

也就是说,您可以做的是将输入作为字符串(例如,从输入读取时不要将其转换为浮点数)。然后你可以这样做:

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"))
Run Code Online (Sandbox Code Playgroud)

这打印

0.00532
0.051960
0.0067124
2
Run Code Online (Sandbox Code Playgroud)

更新

如果您需要对浮动进行操作,您可以尝试使用模糊逻辑来进行接近的演示。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
Run Code Online (Sandbox Code Playgroud)

但请注意, 的精度16纯粹是实验性的,您需要使用它来查看它是否产生所需的结果。如果你需要正确的结果,你就不能走这条路。