Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python按小数位数预先确定的最小步长递增浮点_Python_Increment - Fatal编程技术网

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

Python按小数位数预先确定的最小步长递增浮点,python,increment,Python,Increment,我已经四处搜索了几个小时,但我找不到一个简单的方法来完成以下任务 Value 1 = 0.00531 Value 2 = 0.051959 Value 3 = 0.0067123 我想用最小的小数点来增加每个值(但是,这个数字必须保持它开始时的小数点的精确数目,并且小数的数目随着每个值的不同而变化,因此我的麻烦就来了) 有人知道在一个仍然可以处理任意数量小数的函数中实现上述功能的简单方法吗 谢谢。您看过标准模块了吗 它绕过了浮点行为 只是为了说明可以做些什么 import decimal my

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

Value 1 = 0.00531
Value 2 = 0.051959
Value 3 = 0.0067123
我想用最小的小数点来增加每个值(但是,这个数字必须保持它开始时的小数点的精确数目,并且小数的数目随着每个值的不同而变化,因此我的麻烦就来了)

有人知道在一个仍然可以处理任意数量小数的函数中实现上述功能的简单方法吗


谢谢。

您看过标准模块了吗

它绕过了浮点行为

只是为了说明可以做些什么

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'

印的

0.00532
0.051960
0.0067124
2
0.05200

正如其他评论者所指出的那样:您不应该使用
浮动
,因为给定的数字
0.1234
被转换为内部表示,您无法以您想要的方式进一步处理它。这是故意含糊其辞的。浮点本身就是一个主题。很好地解释了该主题,是该主题的良好入门

也就是说,可以做的是将输入作为字符串(例如,在读取输入时不要将其转换为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
的精度纯粹是实验性的,您需要使用它来看看它是否能产生预期的结果。如果需要正确的结果,则不能采用此路径。

浮点在内部不是以小数表示的,而是以二进制表示的。因此,例如,
0.1
不是一个可表示的浮动。它近似于
0.099999…
ish或
0.1000…
ish。因此它会非常不稳定。相关:如果你真的想这样做,那么你应该切换到非浮点表示法(例如,一个整数和一个给出小数位数的数字)。@TomKarzes的方法是有效的,但请注意,仅仅因为你看到的十进制表示法是
0.00532
,实际上,小数位数可能比您看到的要多,因此如果您没有看到整个表示形式,您可能会得到与预期不同的结果。
.1+.2==0.300000000004
。这里的“真实”最后一位数是多少?@dAJVqgVFsB谢谢。那么你能投票和/或接受我的回答吗?(这是stackoverflow上的货币…)
0.00532
0.051960
0.0067124
2
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