更快地在Python中移动小数以删除零?

时间:2014-03-28 19:16:55

标签: python math optimization

我有各种数字,总是以0和1为界。数字的范围是

.9, .08, .00024, .00000507

我的目标是将这些数字转换为以下

.9, .8, .24, .507

也就是说,我想删除小数点后面的任何零。

我有以下代码来执行此操作。有没有办法在性能方面更快地做到这一点?

import math
x=.009
n = int(-math.log10(x))
x *= math.pow(10, n)

2 个答案:

答案 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')]

在这种情况下,它会给你相同的答案,但可能并不总是如此。