在Python中,将数字的最后一位替换为零,并保持前三位不变的最佳方法是什么?
例子:
例子:
23456789 -> 23400000
112022 -> 112000
1111-> 1110
111 -> 111 (no conversion)
23456789 -> 23400000
112022 -> 112000
1111-> 1110
111 -> 111 (no conversion)
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
将其转换为字符串:
a = 23456789
a_str = str(a)
sol = a_str[0:3]+"0"*(len(a_str)-3)
print(sol)
返回值:23400000
使用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))
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 2Ringn - n%1000
n
,n%1000
可以得到最后三位的值。因此减去它将给出以000
结尾的数字。>>> n = 12345
>>> n - n%1000
12000
>>> n = 1234567
>>> r = 10**5 # I want to zero-out five digits
>>> n - n%r
1200000
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
不确定这是最好的方法,
但我会使用字符串操作和格式化。
number = 23456789
print int(str(number)[:3] + "%0{0}d".format(len(str(number)) - 3) % 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