Как преобразовать десятичное число в int в С#?

Как преобразовать десятичное число в int?

Ответ 1

Используйте Convert.ToInt32 от mscorlib, как в

decimal value = 3.14m;
int n = Convert.ToInt32(value);

См. MSDN. Вы также можете использовать Decimal.ToInt32. Опять же, см. MSDN. Наконец, вы можете сделать прямой трансляции, как в

decimal value = 3.14m;
int n = (int) value;

который использует явный оператор литья. См. MSDN.

Ответ 2

Вы не можете.

Ну, конечно, вы могли бы, однако, int (System.Int32) недостаточно велик, чтобы хранить все возможные десятичные значения.

Это означает, что если вы разделите десятичное число, большее, чем int.MaxValue, вы переполнитесь, а если десятичное число меньше, чем int.MinValue, оно будет истощаться.

Что происходит, когда вы находитесь под/переполнением? Одна из двух вещей. Если ваша сборка не установлена ​​(т.е. CLR не заботится о том, если вы это сделаете), ваше приложение будет продолжено после значения over/underflows, но значение в int будет не таким, как вы ожидали. Это может привести к прерывистым ошибкам и может быть трудно исправить. Вы закончите свое приложение в неизвестном состоянии, что может привести к тому, что ваше приложение разложит все важные данные, над которыми он работает. Нехорошо.

Если ваша сборка проверена (properties- > build- > advanced- > проверяет арифметическое переполнение/недополнение или параметр /checked компилятора), ваш код генерирует исключение, когда происходит переполнение/переполнение. Это, вероятно, лучше, чем нет; однако по умолчанию для сборок не нужно проверять наличие/переполнение.

Реальный вопрос: "Что вы пытаетесь сделать?" Не зная ваших требований, никто не может сказать вам, что вы должны делать в этом случае, кроме очевидного: НЕ ДЕЛАЙТЕ ЭТО.

Если вам конкретно неинтересно, ответы здесь действительны. Тем не менее, вам следует сообщить, что может произойти переполнение и что это не имеет значения, обернув ваш литой код в блоке непроверенный

unchecked
{
  // do your conversions that may underflow/overflow here
}

Таким образом, люди, идущие позади вас, понимают, что вам все равно, и если в будущем кто-то изменяет ваши сборки на/проверке, ваш код не прервется неожиданно.

Если все, что вы хотите сделать, это удалить дробную часть номера, оставив неотъемлемую часть, вы можете использовать Math.Truncate.

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));

Ответ 3

int i = (int)d;

даст вам округленное число.

Если вы хотите округлить до ближайшего четного числа (т.е. > .5 будет округлено), вы можете использовать

int i = (int)Math.Round(d, MidpointRounding.ToEven);

В общем, вы можете использовать между всеми численными типами в С#. Если нет информации, которая будет потеряна во время каста, вы можете сделать это неявно:

int i = 10;
decimal d = i;

хотя вы можете сделать это явно, если хотите:

int i = 10;
decimal d = (decimal)i;

Однако, если вы собираетесь потерять информацию через бросок, вы должны сделать это явно (чтобы показать, что вы знаете, что можете потерять информацию):

decimal d = 10.5M;
int i = (int)d;

Здесь вы теряете ".5". Это может быть хорошо, но вы должны быть откровенно об этом и сделать явное приведение, чтобы показать, что вы можете потерять информацию.

Ответ 4

decimal d = 2;
int i = (int) d;

Это должно работать нормально.

Ответ 5

System.Decimal реализует интерфейс IConvertable, который имеет член ToInt32().

Работает ли вызов System.Decimal.ToInt32() для вас?

Ответ 6

Оптимальным трюком для быстрого округления является добавление .5, прежде чем вы нарисуете свою десятичную цифру на int.

decimal d = 10.1m;
d += .5m;
int i = (int)d;

Остается i=10, но

decimal d = 10.5m;
d += .5m;
int i = (int)d;

Будет округлено так, чтобы i=11.

Ответ 7

Я предпочитаю использовать Math.Round, Math.Floor, Math.Ceiling или Math.Truncate, чтобы явно установить режим округления.

Обратите внимание, что все они также возвращают Decimal, так как Decimal имеет больший диапазон значений, чем Int32, поэтому вам все равно нужно отбрасывать (и проверять переполнение/недополнение).

 checked {
   int i = (int)Math.Floor(d);
 }

Ответ 9

десятичный d = 5.5;

int i = decimal.ToInt32(d);// you will get i = 5

ref: текст ссылки

Ответ 10

Округление десятичного числа до ближайшего целого числа

decimal a ;
int b = (int)(a + 0.5m);

когда a = 49.9, тогда b = 50

когда a = 49.5, тогда b = 50

когда a = 49.4, затем b = 49 и т.д.

Ответ 11

Я нахожу, что оператор литья не работает, если у вас есть десятичное число в коробке (т.е. десятичное значение внутри типа объекта). Convert.ToInt32 (десятичный как объект) отлично работает в этом случае.

Эта ситуация возникает при извлечении значений IDENTITY/AUTONUMBER из базы данных:

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

См. 4.3.2 Разблокировка конверсий