Округление чисел до определенного разрешения

#language-agnostic #resolution #rounding

#не зависит от языка #разрешение #округление

Вопрос:

Я знаю, что во многих языках есть возможность округления до определенного количества знаков после запятой, например, в Python:

 >>> print round (123.123, 1)
    123.1
>>> print round (123.123, -1)
    120.0
  

Но как нам округлить до произвольного разрешения, которое не является десятичным кратным. Например, если бы я хотел округлить число до ближайшей половины или трети, чтобы:

 123.123 rounded to nearest half is 123.0.
456.456 rounded to nearest half is 456.5.
789.789 rounded to nearest half is 790.0.

123.123 rounded to nearest third is 123.0.
456.456 rounded to nearest third is 456.333333333.
789.789 rounded to nearest third is 789.666666667.
  

Комментарии:

1. Этот вопрос задавался много раз раньше. Зачем пользователю с вашей репутацией писать совершенно новый вопрос и давать на него ваш собственный ответ?

2. @Alnitak, если вы можете найти ошибку, отметьте ее так, для этого и есть пометка. Я не смог найти ни одного и в ответ на аналогичное решение, специфичное для Python (округление до четвертей), я придумал решение, которое было применимо к любому разрешению. Мои причины: увеличить пул хороших вопросов и потому, что вопросы и ответы типа jeopardy считаются хорошими, при условии, что они в остальном действительны. И не то чтобы я охочусь за репутацией, я уже достиг дневного предела 🙂

3. смотрите 326476 и 7423023 — вопросы не зависят от языка, но ответы, как правило,

4. Это нормально, но я обычно обнаруживаю, что люди, ищущие решение чего-либо, например, на C #, полностью игнорируют вопросы на VB или Python, независимо от ответов. Ближайшей причиной для вопросов является идентичный вопрос, не похожий вопрос, на который могут быть соответствующие ответы. Вот почему я предпочитаю вопросы, не зависящие от языка. Тем не менее, вы можете распоряжаться своими голосами по своему усмотрению. Если вы не согласны, проголосуйте против или за закрытие.

Ответ №1:

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

Затем вы округляете его до ближайшего целого числа, прежде чем масштабировать обратно.

В Python (который также является очень хорошим языком псевдокода) это было бы:

 def roundPartial (value, resolution):
    return round (value / resolution) * resolution

print "Rounding to halves"
print roundPartial (123.123, 0.5)
print roundPartial (456.456, 0.5)
print roundPartial (789.789, 0.5)

print "Rounding to thirds"
print roundPartial (123.123, 1.0/3)
print roundPartial (456.456, 1.0/3)
print roundPartial (789.789, 1.0/3)

print "Rounding to tens"
print roundPartial (123.123, 10)
print roundPartial (456.456, 10)
print roundPartial (789.789, 10)

print "Rounding to hundreds"
print roundPartial (123.123, 100)
print roundPartial (456.456, 100)
print roundPartial (789.789, 100)
  

В приведенном выше коде именно roundPartial функция обеспечивает функциональность, и это должно быть очень легко перевести на любой процедурный язык с round функцией.

Остальная часть, в основном тестовый жгут, выводит:

 Rounding to halves
123.0
456.5
790.0
Rounding to thirds
123.0
456.333333333
789.666666667
Rounding to tens
120.0
460.0
790.0
Rounding to hundreds
100.0
500.0
800.0