我有各种数字,总是以0和1为界。数字的范围是
.9, .08, .00024, .00000507
我的目标是将这些数字转换为以下
.9, .8, .24, .507
也就是说,我想删除小数点后面的任何零。
我有以下代码来执行此操作。有没有办法在性能方面更快地做到这一点?
import math
x=.009
n = int(-math.log10(x))
x *= math.pow(10, n)
答案 0 :(得分:2)
更快的方法(使用更大的数字变得更快):
def method2(x):
while x < 0.1:
x *= 10
return x
更快:
def method3(x):
while x < 0.01:
x *= 100
while x < 0.1:
x *= 10
return x
这样做的有趣方法(慢于问题):
def remove_zeros(a):
return float("0." + str(long(str(1+a)[2:])))
答案 1 :(得分:0)
这不完全是您的预期输出,但您可以使用它。
如果您将数字存储为小数,则可以将它们格式化为科学记数法,并丢弃除基数之外的所有内容。
>>> from decimal import Decimal
>>> numbers = ['.9', '.08', '.00024', '.00000507']
>>> decimals = [Decimal(n) for n in numbers]
>>> [format(d, '.2E')[:4] for d in decimals]
['9.00', '8.00', '2.40', '5.07']
我在这里将它们显示为字符串,因为它更精确地以这种方式实例化Decimal,因为它避开了浮点问题。如果你从数字作为浮动列表开始,在第三步中你得到:
[Decimal('0.90000000000000002220446049250313080847263336181640625'), Decimal('0.08000000000000000166533453693773481063544750213623046875'), Decimal('0.00024000000000000000608020578329870886591379530727863311767578125'), Decimal('0.0000050699999999999997388091914352070688210005755536258220672607421875')]
在这种情况下,它会给你相同的答案,但可能并不总是如此。