将一个数字的最后n位转换为零

5
在Python中,将数字的最后一位替换为零,并保持前三位不变的最佳方法是什么?
例子:
23456789 -> 23400000
112022 -> 112000
1111-> 1110
111 -> 111 (no conversion)
8个回答

5

round函数可以接受负数参数,这在某些情况下非常有用。但是需要注意的是,它会将结果四舍五入,可能并不完全符合你的要求:

a = 23456789
round(a, -4)

输出:

23460000

如果您不想四舍五入,可以使用一个小的辅助函数,就像下面这个:
import math

def significant(num, signum):

    expo = 10**(int(math.log(num, 10)) - signum + 1)
    return expo * (num // expo)

significant(12345, 3)

输出:

12300

3
请注意这是四舍五入,不会得到预期的输出,例如 2346... 而不是 2345.... - jpp
2
是的,@jpp,你说得对 - 使用负数进行四舍五入非常有用。我添加了一个简短的辅助函数,可以返回指定有效数字的数字。 - Reblochon Masque

4

将其转换为字符串:

a = 23456789

a_str = str(a)

sol = a_str[0:3]+"0"*(len(a_str)-3)

print(sol)

返回值:23400000


2

使用round函数,但是你需要更加聪明才能获得你想要的功能。

def round_n(num, keep=3):
    return round(num, keep - len(str(num)))


round_n(23456789)
Out[72]: 23500000

round_n(112022)
Out[73]: 112000

round_n(1111)
Out[74]: 1110

round_n(111)
Out[75]: 111

注意:此方法仅适用于整数,不适用于浮点数


如果你只想截取而不是四舍五入,则可以采用以下方法

def truncate_int(n, keep=3):
   if n < 0:  # account for '-'
       keep += 1
   s = str(n)
   return int(s[:keep] + '0'*(len(s) - keep))

2
您可以使用math.log10、地板除法和指数函数定义一个转换器函数:
a = 23456789
b = 112022
c = 1111
d = 111

import math

def converter(x, k=3):
    dig = int(math.log10(x)) + 1
    n = dig - k
    return x // 10**n * 10**n

for val in [a, b, c, d]:
    print(val, '->', converter(val))

23456789 -> 23400000
112022 -> 112000
1111 -> 1110
111 -> 111

就此而言,对于具有大量数字的数字,log10 更快,否则 len(str(n)) 更胜一筹。 - PM 2Ring
@PM2Ring,很高兴知道!我自己还没有计时。 - jpp
1
在我的机器上,截止点大约是30个十进制数字,可能会因情况而异。 - PM 2Ring

1
n - n%1000

对于正整数nn%1000可以得到最后三位的值。因此减去它将给出以000结尾的数字。
>>> n = 12345
>>> n - n%1000
12000

如果您想针对其他数字位数执行此操作,可以按照以下方式进行:
>>> n = 1234567
>>> r = 10**5 # I want to zero-out five digits
>>> n - n%r
1200000

1
我会使用向下取整和适当乘数的乘法来完成此操作。这样,我们可以避免四舍五入问题。我们还必须确保乘数是整数。我们可以通过使用max来强制m为非负数。
data = (23456789, 112022, 1111, 111, 6, 98, 987, 9876, 9876598765)

def zero_final(n, digits=3):
    m = 10 ** max(0, len(str(n)) - digits)
    return n // m * m

for n in data:
    print(n, zero_final(n))

输出

23456789 23400000
112022 112000
1111 1110
111 111
6 6
98 98
987 987
9876 9870
9876598765 9870000000

0

不确定这是最好的方法,

但我会使用字符串操作和格式化。

number = 23456789
print int(str(number)[:3] + "%0{0}d".format(len(str(number)) - 3) % 0)

0
您可以尝试使用以下字符串操作:
def number_cov(num):
    x = str(num)
    if len(x)>3:
        cov_num = int(x[0:3]+'0'*(len(x)-3))
    else:
        cov_num = num
    return cov_num

number_cov(11111)
11100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接