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

Вы не можете.

Конечно, вы .net-framework могли, однако int (System.Int32) недостаточно decimals велик для хранения всех возможных decimal десятичных значений.

Это означает, что decimals если вы укажете десятичное c# число, которое больше int.MaxValue, вы c#.net переполнитесь, а если десятичное c#-language число меньше int.MinValue, оно .net будет недостаточным.

Что происходит dot-net при недостаточном / переполнении? Одно c#-language из двух. Если ваша сборка c#.net не отмечена (т.е. CLR не .cs-file заботится, если вы это сделаете), ваше int приложение продолжит работу c#-language после того, как значение csharp over / underflows, но значение c#-language в int будет не таким, как int вы ожидали. Это может приводить csharp к периодическим ошибкам, и c-sharp их трудно исправить. Вы закончите dotnet свое приложение в неизвестном dot-net состоянии, что может привести dot-net к тому, что ваше приложение csharp повредит все важные данные, над decimals которыми оно работает. Не c#.net очень хорошо.

Если ваша сборка c#.net отмечена (свойства-> сборка-> расширенный-> проверка visual-c# арифметического переполнения visual-c# / потери значимости или параметр c-sharp компилятора / checked), ваш visual-c# код выдаст исключение при c#.net возникновении недостаточного visual-c# / переполнения. Это, наверное, лучше, чем dotnet нет; однако по умолчанию c#.net для сборок не проверяется int переполнение / недополнение.

Настоящий c# вопрос - «что вы пытаетесь c#.net сделать?» Не зная ваших требований, никто c# не может сказать вам, что c# вы должны делать в этом случае, кроме decimals очевидного: НЕ ДЕЛАЙТЕ ЭТО.

Если csharp вас это особо не волнует, ответы .net-framework здесь верны. Однако вы должны csharp сообщить о своем понимании того, что .cs-file может произойти переполнение decimals и что это не имеет значения, заключив c#-language код приведения в непроверенный блок

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

Таким decimals образом, люди, идущие за int вами, понимают, что вам все dotnet равно, и если в будущем кто-то dot-net изменит ваши сборки на / checked, ваш c# код неожиданно не сломается.

Если все, что c# вам нужно сделать, это отбросить csharp дробную часть числа, оставив decimals целую часть, вы можете использовать .cs-file Math.Truncate.

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

c#

.net

int

decimal

2022-11-06T03:06:46+00:00