Чому Decimal.Divide (int, int) працює, але не (int / int)?


105

Як приходить ділення двох 32-бітових чисел, коли (int / int) повертається до мене 0, але якщо я використовую, Decimal.Divide()я отримую правильну відповідь? Я в жодному разі не # хлопець.


1
Чи можете ви навести конкретний приклад? Десяткові знаки відрізняються від Int32.
Groo

До речі, я знайшов Decimal.Divide приймає лише десяткові знаки як вхідні дані.
Раві

Decimal.Divide також працює для цілих чисел як вхідних даних.
Тамарай T

Відповіді:


214

int- цілий тип; поділ двох входів виконує ціле ділення, тобто дробова частина обрізана, оскільки вона не може бути збережена у типі результату (також int!). Decimalнавпаки, отримав дробову частину. Після виклику Decimal.Divideваші intаргументи неявно перетворюються на Decimals.

Ви можете застосувати неціле поділ на intаргументи, чітко вставши принаймні один з аргументів типу плаваючої крапки, наприклад:

int a = 42;
int b = 23;
double result = (double)a / b;

2
Гарна відповідь. Я також спробував Decimal.Divide (a, b), який дав такий же результат.
Бакстер

6

У першому випадку ви робите ціле ділення, тому результат обрізається (десяткова частина відсікається) і повертається ціле число.

У другому випадку ints перетворюються спочатку в десяткові знаки, а результат - десятковий. Отже, вони не усічені, і ви отримуєте правильний результат.


4

Наступний рядок:

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

2

Я вважаю, що Decimal.Divide(decimal, decimal)неявно перетворює свої 2 int аргументи в десяткові знаки перед поверненням десяткового значення (точним), коли 4/5 трактується як ціле ділення і повертає 0


1

Ви хочете передати цифри:

подвійний 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();
        }

0

Якщо ви шукаєте відповіді 0 <a <1, int / int буде недостатньо. int / int робить ціле ділення. Спробуйте закинути один із int у подвійний всередині операції.


1
Int32 - це підписане ціле число, ви мали на увазі 0 <відповідь <1?
Groo

0

У моєму випадку вище нічого не працювало.

що я хочу зробити, це поділити 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.


-1

Відповідь, позначена як такою, майже не існує, але я думаю, що варто додати, що між використанням подвійних і десяткових є різниця.

Я б не зробив кращої роботи з поясненням понять, ніж Вікіпедія, тому я просто надаю вказівки:

Арифметика з плаваючою комою

десятковий тип даних

У фінансових системах часто виникає вимога, що ми можемо гарантувати певну кількість точності (десяткових знаків 10). Це взагалі неможливо, якщо вхідні / вихідні дані знаходяться в базі-10, але ми виконуємо арифметику в базі-2 (оскільки кількість десяткових знаків, необхідних для десяткового розширення числа, залежить від основи; одна третина займає нескінченно багато десятків місця, щоб виразити в base-10 як 0,333333 ..., але це має лише один десятковий знак у base-3: 0,1).

Числа з плаваючою комою швидше працювати (з точки зору часу процесора; програмування - однаково просте) і віддається перевагу, коли потрібно мінімізувати помилку округлення (як у наукових програмах).


1
Ніщо у вашій відповіді не відповідає на початкове запитання
LordWilmore
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.