Каков наилучший способ заменить последние цифры числа на ноль, сохранив первые три цифры в Python?

Примере:

23456789 -> 23400000
112022 -> 112000
1111-> 1110
111 -> 111 (no conversion)
3
S Jagdeesh 20 Авг 2018 в 13:39

8 ответов

Лучший ответ

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
Reblochon Masque 13 Сен 2018 в 04:03
n - 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
0
khelwood 20 Авг 2018 в 11:00

Используйте 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

N.b это будет работать только с целыми числами, а не с плавающей точкой


Если вы просто хотите обрезать, а не округлить, то вместо

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
FHTMitchell 20 Авг 2018 в 10:51

Вы можете определить функцию конвертера, используя 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
2
jpp 20 Авг 2018 в 10:48

Вы можете попробовать использовать строковую операцию следующим образом:

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
0
Sandeep Kadapa 20 Авг 2018 в 10:53

Я бы сделал это, используя деление по полу и умножение с соответствующим множителем. Таким образом, мы избегаем проблем с округлением. Мы также должны убедиться, что множитель является целым числом. Мы можем сделать это, используя 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
1
PM 2Ring 20 Авг 2018 в 11:00

Не уверен, что это лучший способ,

Но я бы использовал строковые манипуляции и форматирование.

number = 23456789
print int(str(number)[:3] + "%0{0}d".format(len(str(number)) - 3) % 0)
0
Y.S 20 Авг 2018 в 10:52

Преобразовать его в строку:

a = 23456789

a_str = str(a)

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

print(sol)

Возвращает: 23400000

4
Sharku 20 Авг 2018 в 10:46
51928970