Круглый номер до следующего наивысшего места - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь создать функцию, которая будет возвращать следующий наивысший (из-за отсутствия лучшего термина) «круглый» номер, основанный на наибольшем разряде места (крайнем левом разряде).

Например:

 17     >  20  
 328    >  400  
 18564  >  20000

 //Already round numbers will stay the same:  
 500     >  500

Я знаю, что могу просто сделать что-то вроде этого:

int customRound(int i)
{
    string s = i.ToString();
    if (int.Parse(s.Substring(1)) > 0)
    {
        string greatestDigit = s.Substring(0, 1);
        string digit = (int.Parse(greatestDigit) + 1).ToString();
        return int.Parse(digit + string.Empty.PadRight(s.Length - 1, '0'));
    }
    return i;
}

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

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018
int customRound(int i)
        {
            return (int)(Math.Ceiling(i / Math.Pow(10, i.ToString().Length-1)) * Math.Pow(10, i.ToString().Length - 1));
        }
0 голосов
/ 21 ноября 2018

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

int customRound(int i)
{
    var digits = (int)Math.Floor(Math.Log10(i));
    var unit = (int)Math.Pow(10, digits);
    return (int)(Math.Ceiling((double)i / unit) * unit);
}
...