在python中基于所需精度展开浮点

在python中基于所需精度展开浮点,python,Python,在python中,是否有一种方法/库可以根据所需的精度将数字展开/展开为一系列数字 这里有一个例子 给定我们有一个数字:5.86,小数精度/小数位数:2数字,当我们打开/解开数字时: 要精确到3,则范围为[5.855;5.864](差异:9) 要精确到4,则范围为[5.8550;5.8649](差异:99) p、 当我写这个问题时,我在下面提供了自我回答,我已经使用一些定制的函数解决了这个问题。也许这会对某些人有用 解决方案 def将_值_拆分为_范围(数字、所需的_精度、当前的_精度=-1

python
中,是否有一种方法/库可以根据所需的精度将数字展开/展开为一系列数字

这里有一个例子

给定我们有一个数字:
5.86
,小数精度/小数位数:
2
数字,我们打开/解开数字时:

  • 要精确到
    3
    则范围为
    [5.855;5.864]
    (差异:9)
  • 要精确到
    4
    则范围为
    [5.8550;5.8649]
    (差异:99)

p、 当我写这个问题时,我在下面提供了自我回答,我已经使用一些定制的函数解决了这个问题。也许这会对某些人有用

解决方案
def将_值_拆分为_范围(数字、所需的_精度、当前的_精度=-1):
#您可以决定是否要从外部传递当前精度。。
#就性能而言,可能并不重要
如果当前_精度==-1:
#转换为字符串并从float中删除尾随零
numberStr=f'{number:g}'
#获取当前精度
scale=numberStr[:-1]。查找('.'))
当前_精度=刻度
#求精度差
精度差异=所需精度-当前精度
如果精度_diff<1:
引发异常(“不支持操作。注意:修改函数以满足您的需要”)
#获取要减和加的“位数”
部分减法器=5*(10**(精度差-1))
部分加法器=部分减法器-1
#计算范围内有多少个“数字”
diff=部分加法器+部分减法器
分母=10**所需精度
减法符=部分\减法符/分母
加法器=部分加法器/分母
最小范围=四舍五入(数字-减号,所需精度)
最大范围=四舍五入(数字+加法器,所需精度)
返回最小范围、最大范围、差异
数字=5.86
最小值、最大值、差异=将_值_分成_范围(数字3、2)
打印(f“min={min},max={max},diff={diff}”)
最小值、最大值、差异=将_值_分成_范围(数字4)
打印(f“min={min},max={max},diff={diff}”)
最小值、最大值、差异=将_值_分成_范围(数字5)
打印(f“min={min},max={max},diff={diff}”)
最小值、最大值、差异=将_值_拆分为_范围(数字6)
打印(f“min={min},max={max},diff={diff}”)
输出

min=5.855, max=5.864, diff=9
min=5.855, max=5.8649, diff=99
min=5.855, max=5.86499, diff=999
min=5.855, max=5.864999, diff=9999
已知的限制 如果要使尾随的零保持浮动,则必须使用
十进制
。不要使用
float
:)在上面的示例中,实际上没有必要舍入
min_范围
,因为python无论如何都会处理尾随的零。。不过,我希望代码在输出结果中保持一致,所以我将其保留在代码中。。此外,据我所知,当您从
浮点值中添加或减去值时,可能会出现一些最小偏差,这是由于系统在CPU指令级别上进行浮点处理(低级内容)。。所以在使用浮动时请记住:)


p、 如果您正在阅读此答案,并且知道如何解决此问题的另一种方法,请在可能的情况下附上性能比较报告:)

这正是我应该做的,除了您覆盖了Python的
min()
max()
函数。或者,您可以先将输入转换为整数,进行加减,然后再转换回浮点:
(int(5.86*10**4)+5*10**1-10**0)/10**4->5.8649
,而
5.86+5*10**(-3)-10**(-4)->5.864900000000004