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

ADD относительно каталога сборки. Похоже, что когда вы запускаете docker build [...] ., вы находитесь в каталоге npmanager Maven Webapp, поэтому вы должны иметь возможность добавить путь относительно .:

ADD target/ /usr/local/tomcat/webapps/
211
задан Rob Hruska 23 October 2012 в 12:56
поделиться

9 ответов

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

257
ответ дан jason 23 November 2019 в 04:32
поделиться

Вы не можете.

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

, Который означает, бросаете ли Вы десятичное число, это больше, чем интервал. MaxValue, которого Вы переполните, и если десятичное число меньше, чем интервал. MinValue, это потеряет значимость.

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

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

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

, Если Вы конкретно НЕ заботитесь, ответы здесь действительны. Однако Вы должны связываться Ваше понимание, что переполнение может произойти и что оно не имеет значения путем обертывания кода броска в , снял флажок блок

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

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

, Если все Вы хотите сделать, отбросить дробную часть числа, оставляя неотъемлемую часть, можно использовать Математику. Усеченный.

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
67
ответ дан 23 November 2019 в 04:32
поделиться
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". Это может быть прекрасным, но необходимо быть явными об этом и сделать явный бросок, чтобы показать, что Вы знаете, что можно терять информацию.

43
ответ дан ICR 23 November 2019 в 04:32
поделиться
decimal d = 2;
int i = (int) d;

Это должно работать просто великолепно.

21
ответ дан Vlad Schnakovszki 23 November 2019 в 04:32
поделиться

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

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

8
ответ дан Rohit Vipin Mathews 23 November 2019 в 04:32
поделиться

Аккуратный прием для быстрого округления должен добавить.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.

7
ответ дан DeadlyBrad42 23 November 2019 в 04:32
поделиться

Я предпочитаю использовать Математика. Раунд , Математика. Пол , Математика. Потолок или Математика. Усеченный для явной установки округляющегося режима как соответствующего.

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

 checked {
   int i = (int)Math.Floor(d);
 }
6
ответ дан Mark Brackett 23 November 2019 в 04:32
поделиться

Я считаю, что оператор приведения не работает, если у вас есть десятичное число в штучной упаковке (т.е. десятичное значение внутри типа объекта). 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 Распаковка преобразований

0
ответ дан 23 November 2019 в 04:32
поделиться

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

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

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

6
ответ дан 23 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: