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 等等
谢谢。有些复杂。但是,它是有效的。请确保结果符合您的要求。我想你可以理解如何从代码中对数字进行四舍五入
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)
查看forDecimal.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@BznTT0.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