Python находит первую ненулевую цифру после десятичной точки - PullRequest
6 голосов
/ 04 ноября 2011

Простая проблема, как найти первую ненулевую цифру после десятичной точки. Что мне действительно нужно, так это расстояние между десятичной точкой и первой ненулевой цифрой.

Я знаю, что мог бы сделать это с помощью нескольких строк, но я хотел бы иметь какой-нибудь питонический, красивый и чистый способ решить эту проблему.

Пока у меня есть это

>>> t = [(123.0, 2), (12.3, 1), (1.23, 0), (0.1234, 0), (0.01234, -1), (0.000010101, -4)]
>>> dist = lambda x: str(float(x)).find('.') - 1
>>> [(x[1], dist(x[0])) for x in t]
[(2, 2), (1, 1), (0, 0), (0, 0), (-1, 0), (-4, 0)]

Ответы [ 4 ]

6 голосов
/ 04 ноября 2011

Самый простой способ -

x = 123.0
dist = int(math.log10(abs(x)))

Я интерпретировал вторую запись в каждой паре списка t как желаемый результат, поэтому я выбрал int(), чтобы округлить логарифм до нуля:

>>> [(int(math.log10(abs(x))), y) for x, y in t]
[(2, 2), (1, 1), (0, 0), (0, 0), (-1, -1), (-4, -4)]
5 голосов
/ 04 ноября 2011

Один из способов сосредоточиться на цифрах после десятичной точки - удалить целую часть числа, оставляя дробную часть, с чем-то вроде x - int(x).

Выделив дробную часть, выможет позволить python подсчитать для вас презентацию %e (которая также помогает решить проблемы с округлением).

>>> '%e' % 0.000125
'1.250000e-04'
>>> int(_.partition('-')[2]) - 1
3
1 голос
/ 04 ноября 2011

Хотя технически это можно сделать одной строкой (исключая оператор импорта), я добавил несколько дополнительных вещей, чтобы сделать его более полным.

from re import search

# Assuming number is already defined.
# Floats always have a decimal in its string representation.
if isinstance(float, number):
    # This gets the substring of zeros immediately following the decimal point
    # and returns the length of it.
    return len(search("\.(0*)", "5.00060030").group(1))
else:
    return -1
    # or you can use raise TypeError() if you wanna be more restrictive.

Возможно, это вас не касаетсяно я подумал, что упомяну это для полноты, в некоторых регионах точки и запятые меняются местами, когда дело доходит до цифр.Например, 1 000 000,00 может быть 1 000 000,00.Не уверен, что Python признает это, но поскольку он не представляет никаких чисел с разделителями тысяч, вы можете использовать шаблон ,(0*) для других регионов.Опять же, возможно, это не имеет значения для вас, но может быть для других читателей.

0 голосов
/ 02 февраля 2015
ZerosCount = Ceil(-Log10(Abs(value) - Abs(Floor(value)))) - 1
...