Округлите любое число из n цифр до (n-1) нулей - PullRequest
5 голосов
/ 05 января 2011

Извините, трудно сформулировать.

Мне нужно округлить, как это:

12 -> 10
152 -> 200
1538 -> 2000
25000 -> 30000
etc. 

Скручиваю голову, но не вижу, как это сделать. Должно работать для любого n цифр. У кого-нибудь есть элегантный метод для этого?

c # или vb.net

Ответы [ 6 ]

5 голосов
/ 05 января 2011

Как насчет этого:

        double num = 152;

        int pow = (int)Math.Log10(num);

        int factor = (int)Math.Pow(10, pow);

        double temp = num / factor;

        double result = Math.Round(temp) * factor;
3 голосов
/ 05 января 2011

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

public int Round( int number)
{
    int power = number.ToString().Length - 1;
    int sz = Math.Pow(10, power);

    int rounded = (int)Math.Round( number / sz );

    return rounded * sz;
}

Идея состоит в том, чтобы получить размер ближайшей 10 степени, доступной по длине числа, выраженного в виде строки. Затем разделите число на эту степень, оставив его равным 1,2, а затем округлите его, используя метод Math.Round, и восстановите размер, умножив его на степень.

Так же, как и предыдущий ответ ...

1 голос
/ 05 января 2011

Я бы сделал это так:

double d = 25000;
int power = d.ToString().Length - 1;
double multipler = Math.Pow(10,power);
d = Math.Round(d / multipler) * multipler;
Console.WriteLine(d);
0 голосов
/ 05 января 2011

Разделите число на 10n и округлите результат, затем умножьте результат обратно на 10n;

int MyRound(int num)
{
    double divisor = Math.Pow(10, num.ToString().Length - 1);
    return (int)(Math.Round(num / divisor, MidpointRounding.AwayFromZero) * divisor);
}

Обратите внимание, что мы должны использовать MidpointRounding.AwayFromZero при округлении из-за округления по умолчанию банкира.

0 голосов
/ 05 января 2011
int MakeOneSigFig(int value)
{
    int neg = 1;
    if(value <= 10 && value >= -10) { return value; }
    if(value == int.MinValue) { value = int.MaxValue; neg = -1; }
    if(value < 0) { value = -value; neg = -1; }

    int mult = 10; // start at 10 because we've got 'firstDigit = value / 10' below
    while(value > 99) { value /= 10; mult *= 10; }
    int firstDigit = value / 10;
    if(value % 10 >= 5) firstDigit++;
    return neg * firstDigit * mult;
}

Это эквивалентно MidpointRounding.AwayFromZero.Этот метод не выполняет двойных математических или строковых преобразований.Если вы не хотите зацикливаться, вы можете заменить это блоком if ниже.Это было бы более эффективно, но больше кода и не так просто для чтения.

if(value < 100) { mult = 10; }
else if(value < 1000) { mult = 100; value /= 10; }
else if(value < 10000) { mult = 1000; value /= 100; }
else if(value < 100000) { mult = 10000; value /= 1000; }
// etc.
0 голосов
/ 05 января 2011

Один из способов может быть

  1. Преобразование числа в десятичное
  2. Разделите его на 10 ^ (n-1) (где n - количество цифр)
  3. Теперь используйте функцию округления ( Десятичный. Круглый )
  4. Умножьте еще раз на 10 ^ (n-1)
...