Алгоритм для определения следующего более высокого значения, которое может быть разделено на степень 10

#c# #.net #algorithm #math

#c# #.net #алгоритм #математика

Вопрос:

Я вычисляю число, которое должно быть размером шага оси на гистограмме.

Вычисленное число является наименьшим из возможных (с учетом доступных пикселей и т.д.).

Теперь я хочу округлить это число до следующей степени 10.

Вот как я вычисляю наименьший возможный размер шага:

 var maxNumberOfBars = Math.DivRem(this.Pixel, 8, out remainder); //8 is the min width of a bar
var minRange = (range.End - range.Start) / maxNumberOfBars;`
  

Я приведу несколько примеров для лучшего понимания:
Вычисленное число: 6 — число, которое я хочу: 10

Вычисленное число: 55 — число, которое я хочу: 100

Вычисленное число: 355 — число, которое я хочу: 1000

Вычисленное число: 755 — число, которое я хочу: 1000

Вычисленное число: 5755 — число, которое я хочу: 10000

Итак, мне нужны некоторые вычисления, которые подходят для всех этих случаев.

Ответ №1:

      Math.Pow(10,(int)Math.Ceiling(Math.Log10(number)));    
  

Соответствует вашему примеру

Ответ №2:

Я думаю, вы можете сделать это с Math.Log :

 int val = 55;
var power = Math.Ceiling(Math.Log10(val));
int calcNum = (int)Math.Pow(10, power);

// outputs 100
  

Попробуйте онлайн

Ответ №3:

Используйте это:

 int result = (int)Math.Pow(10,Math.Round(Math.Log(n,10) - Math.Log(5.5,10)   0.5));
  

Взято из:

https://ubuntuforums.org/showthread.php?t=816175

Решение Bichromat

Ответ №4:

Вы можете взять базовую логарифмическую величину 10 и округлить ее до следующей более высокой цифры и произвести вычисления.Следовательно, Pow.

 static void Main(string[] args)
{
    List<int> number = new List<int> { 5, 55, 555, 5555, 55555 };
    number.Select(ReturnLog10Exponent).ToList().ForEach(Console.WriteLine);
}

static int ReturnLog10Exponent(int Number)
{
    double base10Log = Math.Round((Math.Log(Number) / Math.Log(10)), 0);
    return (int)Math.Pow(10, base10Log);
}
  

Которое выводит:

 10
100
1000
10000
100000