Як приходить ділення двох 32-бітових чисел, коли (int / int) повертається до мене 0
, але якщо я використовую, Decimal.Divide()
я отримую правильну відповідь? Я в жодному разі не # хлопець.
Як приходить ділення двох 32-бітових чисел, коли (int / int) повертається до мене 0
, але якщо я використовую, Decimal.Divide()
я отримую правильну відповідь? Я в жодному разі не # хлопець.
Відповіді:
int
- цілий тип; поділ двох входів виконує ціле ділення, тобто дробова частина обрізана, оскільки вона не може бути збережена у типі результату (також int
!). Decimal
навпаки, отримав дробову частину. Після виклику Decimal.Divide
ваші int
аргументи неявно перетворюються на Decimal
s.
Ви можете застосувати неціле поділ на 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).
Числа з плаваючою комою швидше працювати (з точки зору часу процесора; програмування - однаково просте) і віддається перевагу, коли потрібно мінімізувати помилку округлення (як у наукових програмах).