преобразование int в десятичное число, выбирая, где поставить десятичное место - PullRequest
0 голосов
/ 23 мая 2018

У меня есть интересная проблема, мне нужно преобразовать int в десятичное число.

Так, например, с учетом:

int number = 2423;
decimal convertedNumber = Int2Dec(number,2);
// decimal should equal 24.23

decimal convertedNumber2 = Int2Dec(number,3);
// decimal should equal 2.423

Я поиграл, и эта функция работает, япросто ненавижу, что мне нужно создать строку и преобразовать ее в decimal, это не очень эффективно:

decimal IntToDecConverter(int number, int precision)
{
   decimal percisionNumber = Convert.ToDecimal("1".PadRight(precision+1,'0'));
   return Convert.ToDecimal(number / percisionNumber);
}

Ответы [ 5 ]

0 голосов
/ 23 мая 2018

Вы можете попробовать создать decimal явно с конструктором , который был специально разработан для этого:

public static decimal IntToDecConverter(int number, int precision) {
  return new decimal(Math.Abs(number), 0, 0, number < 0, (byte)precision);
}

Например

Console.WriteLine(IntToDecConverter(2423, 2));
Console.WriteLine(IntToDecConverter(1956, 3));

Результат:

24.23
1.956
0 голосов
/ 23 мая 2018

Преобразуйте ваш метод, как показано ниже

public static decimal IntToDecConverter(int number, int precision)
{
   return = number / ((decimal)(Math.Pow(10, precision)));
}

Проверьте живую скрипку здесь .

0 голосов
/ 23 мая 2018

Так как вы пытаетесь уменьшить число, вы не можете просто разделить на 10 (1 десятичный знак), 100 (2 десятичных знака), 1000 (3 десятичных знака) и т. Д.

Обратите внимание нашаблон еще?Увеличивая цифры справа от десятичного разряда, мы также увеличиваем начальное значение, которое делится (10 на 1 цифру после десятичного знака, 100 на 2 цифры после десятичного разряда и т. Д.), В десять раз.

Таким образом, шаблон означает, что мы имеем дело со степенью 10 (Math.Pow(10, x)).

Учитывая вход (число десятичных разрядов), сделайте преобразование на основе этого.

Пример:

int x = 1956;
int powBy=3;

decimal d = x/(decimal)Math.Pow(10.00, powBy);
//from 1956 to 1.956 based on powBy

Сказав это, оберните его в функцию:

decimal IntToDec(int x, int powBy)
 {
  return x/(decimal)Math.Pow(10.00, powBy);
 }

Назовите это так:

decimal d = IntToDec(1956, 3);

Идя в противоположном направлении

Вы также можете сделать обратное, если кто-то заявил, что хочет взять десятичное число, например 19,56, и преобразовать его в int.Вы по-прежнему будете использовать механизм Pow, но вместо деления вы умножите.

double d=19.56;
int powBy=2;
double n = d*Math.Pow(10, powBy);
0 голосов
/ 23 мая 2018

число / percisionNumber даст вам целое число, которое вы затем преобразуете в десятичное число.

Попробуйте ...

return Convert.ToDecimal(number) / percisionNumber;
0 голосов
/ 23 мая 2018

Перемещение десятичной точки таким образом является просто функцией умножения / деления на степень 10.

Так что эта функция будет работать:

decimal IntToDecConverter(int number, int precision)
{
    // -1 flips the number so its a fraction; same as dividing below
    decimal factor = (decimal)Math.Pow(10, -1*precision)
    return number * factor;
}
...