عشري مقابل مزدوج! - أي واحد يجب أن أستخدمه ومتى؟ [مكرر
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- متى يجب أن أستخدم ضعف بدلا من عشري؟ 12 إجابة
أظل رؤية أشخاص يستخدمون الزوجي في C #. أعلم أنني قرأت في مكان ما الذي يتضاعف في بعض الأحيان يفقد الدقة. سؤالي هو متى يجب استخدام مزدوج ومتى يجب أن أستخدم نوع عشري؟ أي نوع مناسب لحسابات النقود؟ (أي أكبر من 100 مليون دولار)
المحلول
من اجل المال، دائما عدد عشري. لهذا السبب تم إنشاؤه.
إذا كان يجب إضافة الأرقام بشكل صحيح أو توازن، استخدم عشري. يتضمن ذلك أي تخزين مالي أو حسابات أو درجات أو أرقام أخرى قد يقوم بها الناس باليد.
إذا كانت القيمة الدقيقة للأرقام ليست مهمة، فاستخدم ضعف السرعة. يتضمن ذلك رسومات أو فيزياء أو حسابات العلوم الفيزيائية الأخرى حيث يوجد بالفعل "عدد من الأرقام المهمة".
نصائح أخرى
سؤالي هو متى يجب استخدام مزدوج ومتى يجب أن أستخدم نوع عشري؟
decimal
لأنه عند العمل مع القيم في نطاق 10 ^ (+/- 28)، حيث لديك توقعات حول السلوك بناء على تمثيلات قاعدة 10 - في الأساس المال.
double
لأنه عندما تحتاج نسبيا الدقة (أي فقدان الدقة في الأرقام الزائدة على القيم الكبيرة ليست مشكلة) عبر المغناطين المختلفة بعنف - double
يغطي أكثر من 10 ^ (+/- 300). الحسابات العلمية هي أفضل مثال هنا.
أي نوع مناسب لحسابات النقود؟
عدد عشري، عدد عشري, عدد عشري
لا تقبل أي بدائل.
العامل الأكثر أهمية هو ذلك double
, ، يجري تنفيذها ككسر ثنائي، لا يمكن أن يمثل بدقة الكثير decimal
الكسور (مثل 0.1) على الاطلاق وعددها الإجمالي للأرقام أصغر لأنه واسع 64 بت مقابل 128 بت decimal
. وبعد أخيرا، غالبا ما تضطر التطبيقات المالية إلى متابعة أوضاع التقريب (يفوض في بعض الأحيان بموجب القانون). decimal
يدعم هذه; double
لا.
system.single. / يطفو - 7 أرقام
System.Double. / مزدوج - 15-16 أرقام
system.decimal. / عدد عشري - 28-29 أرقام مهمة
الطريقة التي كنت قد قمت بها باستخدام النوع الخطأ (قبل بضع سنوات جيدة) بكميات كبيرة:
- £ 520،532.52 - 8 أرقام
- 1،323،523.12 - 9 أرقام
أنت تنفد في 1 مليون لطفو.
القيمة النقدية المكونة من 15 رقما:
- £1,234,567,890,123.45
9 تريليون مع ضعف. ولكن مع التقسيم والمقارنات، فهو أكثر تعقيدا (أنا بالتأكيد لا يوجد خبير في الأرقام العائمة والأرقام غير العقلانية - انظر نقطة مارك). خلط الكسور العشرية وضاعف يسبب القضايا:
قد لا تسفر العملية الرياضية أو المقارنة التي تستخدم رقم نقطة عائمة نفس النتيجة إذا تم استخدام رقم عشري لأن رقم النقطة العائمة قد لا يقبل بالضبط الرقم العشري تماما.
متى يجب أن أستخدم ضعف بدلا من عشري؟ لديه بعض الإجابات المتشابهة وأكثر في العمق.
استخدام double
بدلا من decimal
للتطبيقات النقدية هو التحسين الصغير - هذا هو أبسط طريقة أنظر إليها.
عشري هو للقيم الدقيقة. مزدوج هو لقيم تقريبية.
USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)
من اجل المال: decimal
. وبعد يكلف المزيد من الذاكرة، ولكن ليس لديه مشاكل التقريب مثل double
في بعض الأحيان.
بالتااكيد استخدم أنواع عدد صحيح لحسابات أموالك. لا يمكن التأكيد على هذا بما فيه الكفاية، لأنه من النظرة الأولى قد يبدو أن نوع النقطة العائمة كافية.
هنا مثال في رمز بيثون:
>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0
تبدو طبيعية جدا.
حاول الآن هذا مرة أخرى مع 10 ^ 20 دولار زيمبابوي
>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0
كما ترون، اختفى الدولار.
إذا كنت تستخدم نوع عدد صحيح، فإنه يعمل بشكل جيد:
>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1
أعتقد أن الاختلاف الرئيسي بجانب عرض البت هو أن العشرية لديها قاعدة رأسية 10 وضاعف 2
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html.html.