在Python中快速移位小数以去除零的方法?

4 投票
2 回答
832 浏览
提问于 2025-04-18 00:21

我有一些数字,它们的范围总是在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

这可能不是你想要的结果,但你可以试试这个方法。

如果你把数字存储为小数(Decimals),你可以把它们格式化成科学计数法,只保留底数部分。

>>> 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('0.90000000000000002220446049250313080847263336181640625'), Decimal('0.08000000000000000166533453693773481063544750213623046875'), Decimal('0.00024000000000000000608020578329870886591379530727863311767578125'), Decimal('0.0000050699999999999997388091914352070688210005755536258220672607421875')]

在这种情况下,它给出的结果是一样的,但不一定每次都是这样。

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:])))

撰写回答