Як приходить ділення двох 32-бітових чисел, коли (int / int) повертається до мене 0, але якщо я використовую, Decimal.Divide()я отримую правильну відповідь? Я в жодному разі не # хлопець.
Як приходить ділення двох 32-бітових чисел, коли (int / int) повертається до мене 0, але якщо я використовую, Decimal.Divide()я отримую правильну відповідь? Я в жодному разі не # хлопець.
Відповіді:
int- цілий тип; поділ двох входів виконує ціле ділення, тобто дробова частина обрізана, оскільки вона не може бути збережена у типі результату (також int!). Decimalнавпаки, отримав дробову частину. Після виклику Decimal.Divideваші intаргументи неявно перетворюються на Decimals.
Ви можете застосувати неціле поділ на intаргументи, чітко вставши принаймні один з аргументів типу плаваючої крапки, наприклад:
int a = 42;
int b = 23;
double result = (double)a / b;
У першому випадку ви робите ціле ділення, тому результат обрізається (десяткова частина відсікається) і повертається ціле число.
У другому випадку ints перетворюються спочатку в десяткові знаки, а результат - десятковий. Отже, вони не усічені, і ви отримуєте правильний результат.
Наступний рядок:
int a = 1, b = 2;
object result = a / b;
... буде виконуватися за допомогою цілочисельної арифметики . Decimal.Divideз іншого боку, приймає два параметри типу Decimal, тому поділ буде здійснюватися на десяткові значення, а не цілі значення. Це рівнозначно цьому:
int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;
Щоб перевірити це, ви можете додати наступні рядки коду після кожного з наведених вище прикладів:
Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());
Вихід у першому випадку буде
0
System.Int32
..і у другому випадку:
0,5
System.Decimal
Ви хочете передати цифри:
подвійний c = (подвійний) a / (подвійний) b;
Примітка: Якщо будь-який аргумент у C # є подвійним, використовується подвійне ділення, що призводить до подвійного. Отже, працює і таке:
подвійний c = (подвійний) a / b;
ось Мала програма:
static void Main(string[] args)
{
int a=0, b = 0, c = 0;
int n = Convert.ToInt16(Console.ReadLine());
string[] arr_temp = Console.ReadLine().Split(' ');
int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
foreach (int i in arr)
{
if (i > 0) a++;
else if (i < 0) b++;
else c++;
}
Console.WriteLine("{0}", (double)a / n);
Console.WriteLine("{0}", (double)b / n);
Console.WriteLine("{0}", (double)c / n);
Console.ReadKey();
}
У моєму випадку вище нічого не працювало.
що я хочу зробити, це поділити 278 на 575 і помножити на 100, щоб знайти відсоток.
double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);
%: 48,3478260869565 -> 278/575 ---> 0%: 51,6521739130435 -> 297/575 ---> 0
якщо я помножую PeopleCount на 1.0, це робить його десятковим, а ділення буде 48.34 ... також помножте на 100.0, а не на 100.
Відповідь, позначена як такою, майже не існує, але я думаю, що варто додати, що між використанням подвійних і десяткових є різниця.
Я б не зробив кращої роботи з поясненням понять, ніж Вікіпедія, тому я просто надаю вказівки:
У фінансових системах часто виникає вимога, що ми можемо гарантувати певну кількість точності (десяткових знаків 10). Це взагалі неможливо, якщо вхідні / вихідні дані знаходяться в базі-10, але ми виконуємо арифметику в базі-2 (оскільки кількість десяткових знаків, необхідних для десяткового розширення числа, залежить від основи; одна третина займає нескінченно багато десятків місця, щоб виразити в base-10 як 0,333333 ..., але це має лише один десятковий знак у base-3: 0,1).
Числа з плаваючою комою швидше працювати (з точки зору часу процесора; програмування - однаково просте) і віддається перевагу, коли потрібно мінімізувати помилку округлення (як у наукових програмах).