Как мне удастся сделать так math.ceil
, чтобы число присваивалось следующей по величине степени 10?
# 0.04 -> 0.1
# 0.7 -> 1
# 1.1 -> 10
# 90 -> 100
# ...
Мое текущее решение - это словарь, который проверяет диапазон входного числа, но он жестко запрограммирован, и я бы предпочел однострочное решение. Может быть, я упускаю простой математический трюк или соответствующую функцию numpy здесь?
10
сверху, для этого нужно что-то, напримерlog10
.Ответы:
Вы можете использовать
math.ceil
с,math.log10
чтобы сделать это:log10(n)
дает вам решение,x
которое удовлетворяет10 ** x == n
, поэтому, если вы округлитеx
его, вы получите показатель степени для следующей наивысшей степени 10.Обратите внимание, что для значения,
n
гдеx
уже есть целое число, «следующая наивысшая степень 10» будетn
:источник
10 ** math.ceil(math.log10(1)) == 1
, что не является «следующей высшей силой»Ваша проблема недостаточно указана, вам нужно отступить и задать несколько вопросов.
В другом ответе было предложено взять логарифм, затем округлить (функция потолка), затем возвести в степень.
К сожалению, это страдает от ошибок округления. Прежде всего, n преобразуется из любого типа данных, в который он входит, в число с плавающей запятой двойной точности, что потенциально может привести к ошибкам округления, а затем вычисляется логарифм, потенциально вводящий больше ошибок округления как во внутренних вычислениях, так и в результате.
Таким образом, мне не потребовалось много времени, чтобы найти пример, в котором он дал неверный результат.
Теоретически также возможно, что он потерпит неудачу в другом направлении, хотя это, кажется, намного сложнее спровоцировать.
Таким образом, для надежного решения для чисел с плавающей запятой и целых чисел мы должны предположить, что значение нашего логарифма является только приблизительным, и поэтому мы должны протестировать несколько возможностей. Нечто подобное
Я считаю, что этот код должен давать правильные результаты для всех аргументов в разумном диапазоне реальных величин. Он сломается для очень малого или очень большого числа нецелочисленных и не плавающих типов из-за проблем, конвертирующих их в плавающую Особые аргументы Python для целочисленных аргументов функции log10 в попытке предотвратить переполнение, но все же с достаточно большим целым числом может быть возможно вызвать неверные результаты из-за ошибок округления.
Для тестирования двух реализаций я использовал следующую тестовую программу.
Это находит много сбоев в наивной реализации, но не в улучшенной реализации.
источник
round
вместоmath.ceil
? Это приведет к множеству ненужных случаев, когдаr < n
это правда, и поэтому необходимо выполнить дополнительную работу.Кажется, вы хотите получить наименьшую следующую степень 10 ... Вот способ, использующий чистую математику и не бревно, а рекурсию.
источник
Может быть как то так? Это просто у меня в голове, но сработало, когда я попробовал несколько номеров в терминале.
источник
Проверь это!
Этот код основан на принципах силы десяти в
len( str( int( float_number ) ) )
.Есть 4 случая:
int( i ) > 1
,Float
число - преобразуется вint
, после этого строкаstr()
из него, даст нам,string
сlength
которой мы смотрим точно. Итак, первая часть, для вводаi > 1.0
- это десять10
в степени этой длины.i > 1.0
иi > 0.1
<=> оно есть10
и1
соответственно.i < 0.1
: здесь десять должны быть в отрицательной силе. Чтобы получить первый ненулевой элемент после запятой, я использовал такую конструкцию("%.100f" % i ).replace('.','').index( k )
, где k пробегает[1:10]
интервал. После этого возьмите минимум списка результатов. И уменьшить на единицу, это первый ноль, который должен быть посчитан. Кроме того , здесь стандарт языка Pythonindex()
может произойти сбой, если он не будет найти по крайней мере , один из ненулевых элементов из[1:10]
интервала, поэтому в конце концов я должен «фильтр» список вхождения:if str( j ) in "%.100f" % i
. Кроме того, чтобы получить более точную информацию -%.100f
могут быть приняты разные.источник