سؤال

أنا دائما أقول في c# متغير من نوع double ليست مناسبة المال.كل أشياء غريبة يمكن أن يحدث.ولكن أنا لا يمكن أن يبدو لخلق مثال لتوضيح بعض هذه القضايا.يمكن لأي شخص تقديم مثل هذا المثال ؟

(تحرير ؛ هذا المنصب كان في الأصل معلم#C;بعض الردود الرجوع إلى تفاصيل محددة decimal, مما يعني System.Decimal).

(تحرير 2:كنت محددة يسأل عن بعض التعليمات البرمجية c#, لذلك أنا لا أعتقد أن هذا هو لغة الملحد فقط)

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

المحلول

وجدا، غير مناسبة للغاية. استخدام عشري.

double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false

و(على سبيل المثال من صفحة هنا - أوصى ؛-p القراءة)

نصائح أخرى

وسوف تحصل أخطاء غريبة تسبب بفعالية التقريب. وبالإضافة إلى ذلك، مقارنات مع القيم بالضبط هي صعبة للغاية - عادة تحتاج لتطبيق نوعا من إبسيلون للتحقق من القيمة الفعلية يجري "القريب" واحد بعينه

.

إليك مثالا ملموسا:

using System;

class Test
{
    static void Main()
    {
        double x = 0.1;
        double y = x + x + x;
        Console.WriteLine(y == 0.3); // Prints False
    }
}

نعم انها غير صالحة.

إذا كنت أتذكر بشكل صحيح مزدوجة حوالي 17 أعداد كبيرة ، لذلك عادة أخطاء التقريب سوف تأخذ مكان بعيد خلف النقطة العشرية.معظم البرامج المالية يستخدم 4 العشرية وراء الفاصلة العشرية ، أن يترك 13 عشرية للعمل مع أكبر عدد ممكن يمكنك العمل مع واحد العمليات لا تزال أعلى بكثير من الولايات المتحدة الأمريكية الديون الوطنية.ولكن أخطاء التقريب سوف تضيف ما يصل مع مرور الوقت.إذا كان البرنامج يعمل لفترة طويلة سوف تبدأ في نهاية المطاف فقدان سنتا.عمليات معينة سيجعل الأمور أسوأ.على سبيل المثال إضافة كميات كبيرة إلى كميات صغيرة سوف يسبب خسارة كبيرة من الدقة.

كنت بحاجة إلى نقطة ثابتة أنواع البيانات من أجل المال عمليات معظم الناس لا تمانع إذا كنت تفقد المائة من هنا وهناك ولكن المحاسبين ليست مثل معظم الناس..

تحرير
ووفقا لهذا الموقع http://msdn.microsoft.com/en-us/library/678hzkk9.aspx الزوجي فعلا 15 إلى 16 ارقام كبيرة بدلا من 17.

@جون السكيت عشري هو أكثر ملاءمة من الضعف بسبب ارتفاع الدقة ، 28 أو 29 كبيرة العشرية.وهذا يعني فرصة أقل من تراكم أخطاء التقريب تصبح كبيرة.نقطة ثابتة أنواع البيانات (أي الأعداد الصحيحة التي تمثل سنتا أو 100 من المائة كما رأيت المستخدمة) مثل فوتوغرافية boojum يذكر في الواقع أكثر ملاءمة.

ومنذ decimal يستخدم عامل التحجيم من مضاعفات 10، الأرقام كما 0،1 يمكن تمثيل بالضبط. في جوهرها، ونوع العشري يمثل هذا ك 1/10 ^ 1، في حين أن double سيمثل هذا كما 104857/2 ^ 20 (في واقع الأمر سيكون أشبه <م> حقا-كبيرة-العدد / 2 ^ 1023).

وA decimal يمكن أن تمثل بالضبط أي قيمة قاعدة 10 مع ما يصل الى 28/29 الأرقام المعنوية (مثل 0.1). A double لا يمكن.

وما أفهمه هو أن معظم النظم المالية تعبر عن العملة استخدام الأعداد الصحيحة - أي عد كل شيء في سنتا

وIEEE مزدوجة الدقة في الواقع يمكن تمثل جميع الأعداد الصحيحة بالضبط في حدود -2 ^ 53 من خلال + 2 ^ 53. (البهجة هاكر، ص. 262) إذا كنت تستخدم فقط الجمع والطرح والضرب، وإبقاء كل شيء إلى أعداد صحيحة ضمن هذا النطاق ثم سترى عدم فقدان الدقة. سأكون حذرا جدا من عمليات تقسيم أو أكثر تعقيدا، ولكن.

وعن طريق مضاعفة عندما كنت لا تعرف ما تقومون به هو غير مناسب.

و"المزدوج" يمكن أن تمثل مبلغ تريليون دولار مع وجود خطأ من 1/90 من المائة. لذلك سوف تحصل على نتائج دقيقة للغاية. تريد حساب كم يكلف لوضع رجل على سطح المريخ والحصول عليه على قيد الحياة مرة أخرى؟ وضعف تفعل ما يرام.

ولكن مع المال غالبا ما تكون هناك قواعد محددة للغاية قائلا ان عملية حسابية معينة يجب أن تعطي نتيجة معينة وليس غيره. إذا كنت تحسب على المبلغ الذي هو جدا جدا قريبة جدا من 98.135 $ ثم وغالبا ما يكون هناك حكم أن يحدد ما إذا كان يجب أن تكون النتيجة 98.14 $ أو $ 98.13 وكنت <م> يجب اتبع هذه القاعدة والحصول على النتيجة المطلوبة .

واعتمادا على المكان الذي تعيش فيه، وذلك باستخدام 64 بت لتمثيل الأعداد الصحيحة سنتا أو البنسات أو كوبيك أو ما هو وأصغر وحدة في بلدك عادة ما تعمل على ما يرام. على سبيل المثال، وقعت 64 بت الأعداد الصحيحة تمثل سنتا يمكن أن تمثل القيم يصل الى 92223 تريليون دولار. 32 الأعداد الصحيحة قليلا وعادة ما تكون غير مناسبة.

ولا مزدوج سوف يكون دائما أخطاء التقريب، استخدم "عشري" إذا كنت على صافي ...

فعلا النقطة العائمة مزدوج تماما تماما تمثل مبالغ من المال طالما يمكنك اختيار مناسب الوحدة.

انظر http://www.idinews.com/moneyRep.html

لذلك هو نقطة ثابتة طويلة.إما أن يستهلك 8 بايت, بالتأكيد أفضل 16 المستهلكة من قبل عشري البند.

ما إذا كان أو لم يعمل شيئا (أيينتج يتوقع النتيجة الصحيحة) ليست مسألة إما التصويت أو تفضيل الأفراد.تقنية إما يعمل أو لا.

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