Python 3.x 如何在“a”中进行算法循环;“聪明的”;自动方式

Python 3.x 如何在“a”中进行算法循环;“聪明的”;自动方式,python-3.x,rounding,Python 3.x,Rounding,我想在代码中对数字进行四舍五入,但要使其适应每个值 例如,我希望舍入算法返回: 0.999999它应该返回1 0.0749999它应返回0.075 0.006599它应该返回0.0066 等等 我事先不知道位数(这是我的问题) 我想用字符串来找出9(或0)在哪里,但我想这是相当多的工作 如果您知道如何做到这一点(如果没有高级库的话),我将不胜感激 谢谢。有些复杂。但是,它是有效的。请确保结果符合您的要求。我想你可以理解如何从代码中对数字进行四舍五入 def clear9(numstr):

我想在代码中对数字进行四舍五入,但要使其适应每个值

例如,我希望舍入算法返回:

  • 0.999999它应该返回1
  • 0.0749999它应返回0.075
  • 0.006599它应该返回0.0066 等等
我事先不知道位数(这是我的问题)

我想用字符串来找出9(或0)在哪里,但我想这是相当多的工作

如果您知道如何做到这一点(如果没有高级库的话),我将不胜感激


谢谢。

有些复杂。但是,它是有效的。请确保结果符合您的要求。我想你可以理解如何从代码中对数字进行四舍五入

def clear9(numstr):
    liststr = list(numstr)
    for index in range(len(liststr)-1,-1,-1):
        if liststr[index] == '.': continue
        if liststr[index] == '9': 
            liststr[index] = '0'
            if index == 0:
                liststr.insert(0, '1')
        else: 
            if index != len(liststr)-1:
                liststr[index] = str(int(liststr[index])+1)
            break
    numstr = ''
    for item in liststr:
        numstr += item
    return numstr

def myround(num):
    numstr = str(num)
    numstr = clear9(numstr)
    return float(numstr)


print (myround(9.05))
print (myround(9.999999))
print (myround(0.999999))
print (myround(0.0749999))
print (myround(0.006599))
print (myround(0.00659923))
print (myround(0.09659923))
print (myround(-0.00659923))
输出:

1
0.075
0.0066
-0.00044

处理浮点数很棘手。您希望以10为基数进行舍入,但浮点数是以2为基数的

因此,我建议使用
十进制
模块,它可以准确地表示实数,而不是基数为2的浮点:

from decimal import Decimal

def myround(num):
    dec = Decimal(num)
    adj = abs(dec.adjusted())+1
    return round(num, adj)
查看for
Decimal.adjusted()
以了解其工作原理

测试:

In [1]: from decimal import Decimal                                                                      

In [2]: def myround(num): 
   ...:     dec = Decimal(num) 
   ...:     adj = abs(dec.adjusted())+1 
   ...:     return round(num, adj) 
   ...:                                                                                                  

In [3]: myround(0.999999)                                                                                
Out[3]: 1.0

In [4]: myround(0.006599)                                                                                
Out[4]: 0.0066

In [5]: myround(0.0749999)                                                                               
Out[5]: 0.075

捕捉所有边缘情况可能会很棘手,例如,
myround(9.05)==0.0
Thank you Yaho。正如马克指出的,这是你的方法的主要问题,因为我可以有任何数字(如0.099649999),这使得它tricky@BznTT您应该通过
0.099649999
获得什么号码
0.1
0.09965
?@yahocho 0.09965是我想要的值。。。也许我应该搜索X个连续的“9”来减少出错的空间?我想你需要选择一些数字。比如如果你有
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007499
。你真的想保留所有领先的
0
s吗?你最终想做什么?这只是为了在一些打印输出中显示一个数字吗?@pault是的,它不应该超过10E-5。@WarrenWeckesser基本上我是在尝试评估a==B,但在计算过程中python会给a添加数字错误,最后它不等于B(但应该是),因为a=0.07499,B=0.075(如果有意义的话?)@BznTT似乎您应该使用它,它看起来很有趣,但据我所知,您在舍入的数字中任意添加“+2”,这样它就无法处理像“0.074569999…”这样的数字,而我希望“0.07457”您的代码返回“0.075”。。如果我错了,请纠正我。例如,如果你想从0.074569999中得到0.07457,你将使用:abs(dist)+4,在这种情况下,4是你正在“观察”的位数(小数点后最后0位)@BznTTOh我明白了,我想我可以稍微扭转一下它,谢谢@ncica@BznTT
0.09659923
=>
0.097
。我认为应该是
0.09659923
。您好,它工作得很好,但似乎不能处理像“0.1459999”这样的数字,它在返回“0.15”的地方返回“0.146”。另外,我的最终目标是用python实现它,我认为我无法访问adjusted()方法。
from decimal import Decimal

def myround(num):
    dec = Decimal(num)
    adj = abs(dec.adjusted())+1
    return round(num, adj)
In [1]: from decimal import Decimal                                                                      

In [2]: def myround(num): 
   ...:     dec = Decimal(num) 
   ...:     adj = abs(dec.adjusted())+1 
   ...:     return round(num, adj) 
   ...:                                                                                                  

In [3]: myround(0.999999)                                                                                
Out[3]: 1.0

In [4]: myround(0.006599)                                                                                
Out[4]: 0.0066

In [5]: myround(0.0749999)                                                                               
Out[5]: 0.075