#python
Вопрос:
См. воспроизводимый код ниже. Хотите округлить до ближайшего десятичного знака, основываясь на «шаге», установленном для каждого из них в словаре. Желаемый результат указан внизу. Нельзя просто использовать round(x, 1)
или round(x, 2)
, поскольку шаги могут быть разными, если вы не можете определить, в какой позиции 1 находится в десятичном знаке?
from numpy.random import choice from numpy import arange # Define some ranges with steps range_one = {"low": -2.0, "high": 2.0, "step": 0.1} range_two = {"low": -2.0, "high": 2.0, "step": 0.01} range_three = {"low": -2.0, "high": 2.0, "step": 0.001} # Get the full range of values for each a_range_one = arange(range_one['low'], range_one['high'], range_one['step']) a_range_two = arange(range_two['low'], range_two['high'], range_two['step']) a_range_three = arange(range_three['low'], range_three['high'], range_three['step']) # Make a random selection from each range random_choice_one = choice(a_range_one) random_choice_two = choice(a_range_two) random_choice_three = choice(a_range_three) # See the outputs are off print(random_choice_one) print(random_choice_two) print(random_choice_three) # OUTPUT # # Machine rounding/arange issue... # 0.7000000000000024 # -0.22999999999999843 # -1.9890000000000012 # DESIRED OUTPUT (rounding based on the "step" for each) # 0.7 # -0.23 # -1.989
Комментарии:
1. Как насчет использования
-np.log10(step)
для получения приблизительного значения округления?2. Это сработает идеально! Спасибо!!
Ответ №1:
Я предполагаю, что вы отслеживаете шаг каждого выбора. Если вы знаете, что шаги имеют силу 10, вы можете использовать:
print(round(random_choice_one, -int(log10(range_one["step"]))))
Вероятно, вы хотите обернуть это в функцию, возвращающую строку, например
def str_rounded(value: float, rng: dict) -gt; str: return str(round(random_choice_one, -int(log10(rng["step"]))))
который вы можете использовать в качестве print(str_rounded(random_choice_one, range_one))
.
Ответ №2:
Справится ли это с работой?
range_one = [n/10 for n in range(-20, 21)] range_two = [n/100 for n in range(-200, 201)] range_three = [n/1000 for n in range(-2000, 2001)]