Округлить до ближайшего динамического десятичного знака?

#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)]