Як перетворити десятковий знак в цілий?
Як перетворити десятковий знак в цілий?
Відповіді:
Використовувати 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 .
null
проти 0
проти ""
). Я рекомендую ніколи не використовувати Convert, якщо вам абсолютно не потрібна його гнучкість (тобто в динамічно набраних сценаріях)
OverflowException
. Я вважаю , що @Will забезпечує кращий відповідь тут stackoverflow.com/a/501165/39532
Convert.ToInt32
і Decimal.ToInt32
поводьтесь інакше. Від MSDN: Decimal.ToInt32
- повернене значення є невід'ємною частиною десяткового значення; дробові цифри усічені . Convert.ToInt32
- Повернене значення округлюється до найближчого 32-бітного цілого числа. Якщо значення знаходиться на півдорозі між двома цілими числами, повертається парне число; тобто 4,5 перетворюється на 4, а 5,5 перетворюється на 6.
Ви не можете.
Ну, звичайно, ви могли , однак int (System.Int32) не є достатньо великим, щоб вмістити всі можливі десяткові значення.
Це означає, що якщо ви подасте десятковий розмір, більший за int.MaxValue, ви переповниться, а якщо десятковий розмір менший за int.MinValue, він переллється.
Що відбувається, коли ви перебуваєте під / переповненням? Одна з двох речей. Якщо ваша збірка відмічена (тобто CLR не хвилює, чи є), ваш додаток продовжуватиметься після того, як значення перевищить / переливає, але значення в int не буде таким, яке ви очікували. Це може призвести до непостійних помилок і може бути важко виправити. Ви закінчите свою заявку в невідомому стані, що може призвести до пошкодження вашої програми будь-яких важливих даних, на яких вона працює. Не добре.
Якщо ваша збірка перевірена (властивості-> збірка-> розширений-> перевірка на арифметичне переповнення / підводка або параметр / перевірений компілятор), ваш код видасть виняток, коли має місце недолік / переповнення. Це, мабуть, краще, ніж ні; однак за замовчуванням для збірок не є перевірка на перевищення / перелив.
Справжнє питання - "що ти намагаєшся зробити?" Не знаючи ваших вимог, ніхто не може сказати вам, що ви повинні робити в цьому випадку, окрім очевидного: НЕ РОБИТИ.
Якщо вас конкретно НЕ хвилює, відповіді тут справедливі. Однак, ви повинні повідомити про своє розуміння того, що може виникнути переповнення, і що це не має значення, загорнувши свій код для відтворення в неперевірений блок
unchecked
{
// do your conversions that may underflow/overflow here
}
Таким чином, люди, що йдуть за вами, розуміють, що вам все одно, і якщо в майбутньому хтось змінить вашу конструкцію на / перевірив, ваш код не стане несподівано порушеним.
Якщо все, що ви хочете зробити, це скинути дробову частину числа, залишивши невід'ємну частину, ви можете використовувати Math.Truncate.
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
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". Це може бути добре, але ви повинні бути чіткими щодо цього і зробити чіткий склад, щоб показати, що знаєте, що можете втратити інформацію.
ToEven
слід запобігати дрейфу статистики. Якщо ви оперуєте платними предметами чи грошима, це AwayFromZero
здається правильним вибором.
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
Ось дуже зручна веб-сторінка для перетворення типів даних для сторінок інших. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
реалізує IConvertable
інтерфейс, який маєToInt32()
член.
Чи System.Decimal.ToInt32()
працює для вас дзвінок ?
Акуратний трюк для швидкого округлення - додати .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
.
Я вважаю за краще використовувати Math.Round , Math.Floor , Math.Ceiling або Math.Truncate щоб явно встановити режим округлення у відповідних випадках.
Зауважте, що всі вони також повертають десятичну кількість - оскільки у Decimal є більший діапазон значень, ніж у Int32, тому вам все одно потрібно буде робити передачу (і перевірити наявність переливу / переливання).
checked {
int i = (int)Math.Floor(d);
}
Округлення десяткової точки до найближчого цілого числа
decimal a ;
int b = (int)(a + 0.5m);
коли a = 49.9
, тоb = 50
коли a = 49.5
, тоb = 50
коли a = 49.4
, то b = 49
і т.д.
Я вважаю, що оператор кастингу не працює, якщо у вас є десятичне поле (тобто десяткове значення всередині типу об’єкта). 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
SELECT SCOPE_IDENTITY()
повертається, numeric(38, 0)
що перекладається на decimal
.NET. foo.ExecuteScalar()
повертає decimal
коробку, object
яка не може бути передана безпосередньо на int
. (int)(decimal)foo.ExecuteScalar()
або Convert.ToInt32(foo.ExecuteScalar())
працювали б.
Здається, жодна відповідь не стосується OverflowException / UnderflowException, який виникає при спробі перетворення десяткової, що знаходиться поза діапазоном int.
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
Це рішення поверне максимальне або мінімальне можливе значення int, якщо десяткове значення знаходиться поза діапазоном int. Ви можете додати кілька округлення за допомогою Math.Round, Math.Ceiling або Math.Floor, коли значення знаходиться в межах діапазону int.