لماذا Decimal.Divide (الباحث، الباحث) العمل، ولكن ليس (الباحث / الباحث)؟

StackOverflow https://stackoverflow.com/questions/1043164

  •  20-08-2019
  •  | 
  •  

سؤال

وكيف تأتي تقسيم رقمين كثافة العمليات 32 بت (الباحث / الباحث) يعود لي 0، ولكن إذا كنت تستخدم Decimal.Divide() أحصل على الإجابة الصحيحة؟ أنا بأي حال من الأحوال ج # الرجل.

هل كانت مفيدة؟

المحلول

وint هو نوع عدد صحيح. الفاصل بين [إينتس] يؤدي يتم اقتطاع ل<م> صحيحا تقسيم، أي الجزء الكسري لأنه لا يمكن تخزينها في نوع نتيجة (أيضا int!). Decimal، على النقيض من ذلك، وقد حصلت على الجزء الكسري. من خلال التذرع Decimal.Divide، والحصول على حجج int بك تحويلها ضمنيا إلى Decimals.

ويمكنك فرض تقسيم غير صحيح على الحجج int قبل الصب صراحة واحد على الأقل من الحجج إلى نوع الفاصلة العائمة، منها مثلا:

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

نصائح أخرى

في الحالة الأولى، تفعلونه قسمة عدد صحيح، لذلك يتم اقتطاع نتيجة (والمفروم الجزء العشري إيقاف) ويتم إرجاع عدد صحيح.

في الحالة الثانية، يتم تحويل [إينتس] إلى العشرية الأولى، والنتيجة هي عشري. وبالتالي فهي ليست مبتورة وتحصل على النتيجة الصحيحة.

والسطر التالي:

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

وأعتقد Decimal.Divide(decimal, decimal) ضمنيا تحويل الحجج كثافة من 2 إلى العشرية قبل أن تعود قيمة عشرية (دقيقة) حيث و05/04 يعامل قسمة عدد صحيح وإرجاع 0

وأنت تريد أن يلقي الأرقام:

وج مزدوجة = (مزدوج) و/ (مزدوجة) ب؛

ملحوظة: إذا كان أي من الحجج في C # هو ضعف، يتم استخدام الانقسام مزدوج مما يؤدي الى ضعف. لذا، فإن ما يلي يعمل أيضا:

وج مزدوجة = (مزدوجة) أ / ب؛

وهنا هو برنامج صغير:

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 <ل<1 إجابة، الباحث / الباحث لن يكون كافيا. الباحث / الباحث لا قسمة عدد صحيح. محاولة الصب واحدة من ال الباحث إلى ضعف داخل العملية.

في حالتي لا شيء يعمل أعلاه.

ما أريد القيام به هو تقسيم 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 (لأن عدد المنازل العشرية اللازمة لتوسيع عشري عدد يعتمد على قاعدة؛ وثلث يأخذ الكثير بلا حدود عشري الأماكن للتعبير في قاعدة 10 كما 0.333333 ... ولكن يستغرق سوى عشري واحد في قاعدة 3: 0،1).

وأرقام الفاصلة العائمة هي أسرع للعمل مع (من حيث الوقت وحدة المعالجة المركزية، البرمجة الحكمة فهي بسيطة على قدم المساواة) ويفضل كلما كنت ترغب في تقليل الخطأ التقريب (كما هو الحال في التطبيقات العلمية).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top