Swift: округление с плавающей точкой до ближайшего пользовательского множителя - PullRequest
1 голос
/ 05 мая 2019

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

Например, если моя гранулярность (множитель) была равна 0,25, я пытаюсь создатьфункция, которая принимает входной сигнал 0,3 и возвращает 0,25 или 3,89 и возвращает 4,00 (закрывает кратное 0,25).На данный момент я нашел несколько сообщений о том, как округлить до ближайшего десятичного знака, но они, кажется, не применяются в этом случае.

let x = 1.23556789
let y = Double(round(1000*x)/1000)
print(y) //This removes all decimals but three, but only seem to work with multiples of 10.

Любая идея о том, как я мог бы сделать это?

Спасибо!

1 Ответ

5 голосов
/ 05 мая 2019

Здесь вы можете использовать тот же подход, что и округление до степени 10.

Когда вы хотите округлить до ближайшего 0,1, вы умножаете на 10, округляете, а затем делите на 10. Когда вы хотитеокругляя до ближайшего 0,01, вы умножаете на 100, округляете, а затем делите на 100.

Смотрите схему здесь?Число, на которое вы умножаете и делите, всегда равно 1 на гранулярность!

Таким образом, для гранулярности 0,25 вы умножаете и делите на 4:

print(round(0.3 * 4) / 4)
// or
print(round(0.3 / 0.25) * 0.25)

В более общем случае, учитывая granularity: Double и число, чтобы округлить x: Double, мы можем округлить это так:

let rounded = round(x / granularity) * granularity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...