عشري مقابل مزدوج! - أي واحد يجب أن أستخدمه ومتى؟ [مكرر

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

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أظل رؤية أشخاص يستخدمون الزوجي في 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.

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