Подтвердить что ты не робот

Круглый (1, 2 или 5) x 10 ^ n в Objective-C?

Существует ли простой способ округления значения до или до ближайшего (1, 2 или 5) x 10 ^ n, где n - целое число? Как в одном из {...,.0.5.1,.2,.5, 1, 2, 5, 10, 20, 50, 100...}

Спасибо.

4b9b3361

Ответ 1

Вы можете взять d=floor(log10(n)) вашего номера n, чтобы получить масштаб, затем разделите его на 10 на d, чтобы нормализовать число до диапазона [1.0,10.0). С этого момента это должно быть легко округлить, потому что есть очень ограниченные возможности. После того, как вы это сделали, умножьте на 10 на d, чтобы восстановить номер в исходном диапазоне.

Следующая функция в C, я не знаю достаточно о Objective-C, чтобы узнать, является ли это идиоматическим.

double RoundTo125(double value)
{
   double magnitude;
   magnitude = floor(log10(value));
   value /= pow(10.0, magnitude);
   if (value < 1.5)
      value = 1.0;
   else if (value < 3.5)
      value = 2.0;
   else if (value < 7.5)
      value = 5.0;
   else
      value = 10.0;
   value *= pow(10.0, magnitude);
   return value;
}

Ответ 2

Чтобы округлить x до ближайшего значения c * 10^n, используйте

f(c) = c * 10^(floor(log(x/c)))

(предполагая, что x положителен). Чтобы округлить до ближайшего любого из них, просто найдите

max(f(1), f(2), f(5))

Чтобы округлить x до ближайшего значения c * 10^n, используйте

g(c) = c * 10^(ceiling(log(x/c)))

(опять же, полагая x положительным). Чтобы округлить до ближайшего из любого из них, просто найдите

min(g(1), g(2), g(5))

Теперь, чтобы просто округлить до ближайшего из любого из этих значений, найдите ближайшее округление (первый абзац) и ближайшее округление (второй абзац) и выберите, что ближе к x.

Ответ 3

Как я вижу, вы работаете с числами с плавающей запятой. Я хочу указать вам, что в стандартной библиотеке C есть две функции, которые могут вам помочь:

double floor(double); //round down
double ceil(double);  //round up

Они возвращают округленное число. Также существуют другие функции округления. Здесь вы можете найти ссылку здесь. После того как вы узнаете, как они работают, вы можете написать свою собственную функцию округления. Что будет использовать нормализация. Посмотрите на пример:

// this function will round to tens
float my_floor(float d)
{
    return floor(d/10)*10;
}

Ответ 4

Логарифмический подход будет работать, но я бы экспериментировал с преобразованием строки. Я не знаю Objective C, хотя Google подразумевает, что вы хотите что-то под названием stringWithFormat. В Java код будет

String s = String.format("%f", theNumber);
StringBuffer buf = new StringBuffer(s);
int len = buf.length()-1;
char c = buf.getCharAt(len);
switch (c)
{
case '9': case '8': case '7': case '6':
buf.setCharAt(len) = '5'; break;
case '4' : case '3':
buf.setCharAt(len) = '2' break;
default: break; /* don't change '0', '1', '2', '5' */
}
double roundNumber = Double.parseDouble(buf.toString());

Быть быстрее. (Может быть медленнее!) Вы также можете попробовать выполнить поиск строки для десятичной точки и вычесть приращение от исходного числа, как только вы измените значение последнего десятичного знака.