Как мне преобразовать десятичную дробь в int в C #? - PullRequest
207 голосов
/ 01 февраля 2009

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

Ответы [ 11 ]

252 голосов
/ 01 февраля 2009

Используйте 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 .

68 голосов
/ 01 февраля 2009

Вы не можете.

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

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

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

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

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

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

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

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

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

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
43 голосов
/ 01 февраля 2009
int i = (int)d;

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

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

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

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

int i = 10;
decimal d = i;

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

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

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

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

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

20 голосов
/ 01 февраля 2009
decimal d = 2;
int i = (int) d;

Это должно работать просто отлично.

10 голосов
/ 16 июля 2014
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);

Вот очень удобная страница для конвертации данных других типов. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

8 голосов
/ 01 февраля 2009

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

У вас работает System.Decimal.ToInt32() звонок?

7 голосов
/ 01 февраля 2009

Хороший трюк для быстрого округления - добавить .5 до того, как вы приведете десятичное число к целому.

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

Все еще уходит i=10, но

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

округлится так, что i=11.

6 голосов
/ 31 августа 2009

десятичное число d = 5.5;

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

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

6 голосов
/ 01 февраля 2009

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

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

 checked {
   int i = (int)Math.Floor(d);
 }
4 голосов
/ 05 сентября 2011

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

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

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

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

когда a = 49.4, тогда b = 49 и т. Д.

...