الفرق بين العلامة العشرية والعائمة والمزدوجة في .NET؟

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

سؤال

ماهو الفرق بين decimal, float و double في الشباك؟

متى يستخدم شخص ما واحدة من هذه؟

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

المحلول

float و double نكون عائم الثنائية أنواع النقاط.بمعنى آخر، يمثلون رقمًا كالتالي:

10001.10010110011

يتم ترميز كل من الرقم الثنائي وموقع النقطة الثنائية ضمن القيمة.

decimal هو عائم عدد عشري نوع النقطة.بمعنى آخر، يمثلون رقمًا كالتالي:

12345.65789

مرة أخرى، رقم وموقع عدد عشري يتم ترميز كل من النقطة ضمن القيمة - وهذا ما يجعل decimal لا يزال نوع النقطة العائمة بدلاً من نوع النقطة الثابتة.

الشيء المهم الذي يجب ملاحظته هو أن البشر معتادون على تمثيل الأعداد غير الصحيحة في شكل عشري، ويتوقعون نتائج دقيقة في تمثيلات عشرية؛ليست كل الأرقام العشرية يمكن تمثيلها تمامًا بالفاصلة العائمة الثنائية - 0.1، على سبيل المثال - لذلك إذا كنت تستخدم قيمة النقطة العائمة الثنائية، فستحصل فعليًا على تقريبي لـ 0.1.ستظل تحصل على تقديرات تقريبية عند استخدام الفاصلة العشرية العائمة أيضًا - على سبيل المثال، لا يمكن تمثيل نتيجة القسمة 1 على 3 بدقة.

أما بالنسبة لما يجب استخدامه عندما:

  • بالنسبة للقيم التي تعتبر "كسورًا عشرية دقيقة بشكل طبيعي"، فمن الجيد استخدامها decimal.عادةً ما يكون هذا مناسبًا لأي مفاهيم اخترعها البشر:والقيم المالية هي المثال الأكثر وضوحا، ولكن هناك أمثلة أخرى أيضا.خذ بعين الاعتبار النتيجة الممنوحة للغواصين أو المتزلجين على الجليد، على سبيل المثال.

  • بالنسبة للقيم التي تعتبر من صنع الطبيعة والتي لا يمكن قياسها حقًا بالضبط على أي حال، float/double هي أكثر ملاءمة.على سبيل المثال، عادة ما يتم تمثيل البيانات العلمية بهذا النموذج.هنا، لن تكون القيم الأصلية "دقيقة عشريًا" في البداية، لذلك ليس من المهم أن تحافظ النتائج المتوقعة على "الدقة العشرية".يعد التعامل مع أنواع النقاط الثنائية العائمة أسرع بكثير من التعامل مع الكسور العشرية.

نصائح أخرى

والدقة هو الفرق الرئيسي.

تعويم - 7 أرقام (32 بت)

مزدوجة -15-16 أرقام (64 بت)

عشري -28-29 الأرقام المعنوية (128 بت )

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

والكسور العشرية والعربات / الزوجي لا يمكن مقارنة دون المدلى بها في حين العربات والزوجي يمكن. الكسور العشرية تسمح أيضا الترميز أو أصفار زائدة.

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

والنتيجة:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333

تم تصميم الهيكل العشري بشكل صارم للحسابات المالية التي تتطلب الدقة، والتي لا تتحمل التقريب نسبيًا.لكن الأعداد العشرية ليست كافية للتطبيقات العلمية لعدة أسباب:

  • يعد فقدان الدقة أمرًا مقبولًا في العديد من الحسابات العلمية بسبب الحدود العملية للمشكلة الفيزيائية أو القطعة الأثرية التي يتم قياسها.فقدان الدقة غير مقبول في مجال التمويل.
  • العشري أبطأ بكثير (كثيرًا) من التعويم والمضاعف بالنسبة لمعظم العمليات، ويرجع ذلك أساسًا إلى أن عمليات الفاصلة العائمة تتم بشكل ثنائي، في حين تتم العناصر العشرية في الأساس 10 (أي.يتم التعامل مع العوامات والمضاعفات بواسطة أجهزة FPU، مثل MMX/SSE، بينما يتم حساب الكسور العشرية في البرنامج).
  • يحتوي النظام العشري على نطاق قيمة أصغر بشكل غير مقبول من الضعف، على الرغم من أنه يدعم المزيد من الأرقام الدقيقة.لذلك، لا يمكن استخدام العلامة العشرية لتمثيل العديد من القيم العلمية.
+---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5 x 10-45 to ±3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ±1.0 x 10-28 to ±7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+

لمزيد من المعلومات، انظر:
HTTP: //social.msdn .microsoft.com / منتديات / EN-US / csharpgeneral / موضوع / 921a8ffc-9829-4145-bdc9-a96c1ec174a5

float 7 أرقام من الدقة

double لديه حوالي 15 رقما من الدقة

decimal لديه حوالي 28 رقما من الدقة

إذا كنت تريد دقة أفضل، فاستخدم double بدلاً من float.في وحدات المعالجة المركزية الحديثة يتمتع كلا النوعين من البيانات بنفس الأداء تقريبًا.الميزة الوحيدة لاستخدام العوامة هي أنها تشغل مساحة أقل.لا يهم عمليا إلا إذا كان لديك الكثير منهم.

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

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

متى يستخدم شخص ما واحدة من هذه؟

استخدم العلامة العشرية لـ عد قيم

استخدم تعويم/مزدوج لـ قياس قيم

بعض الأمثلة:

  • المال (هل نحسب المال أم نقيس المال؟)

  • المسافة (هل نحسب المسافة أم نقيس المسافة؟*)

  • الدرجات (هل نحسب الدرجات أم نقيس الدرجات؟)

نحن نحسب المال دائمًا ولا ينبغي لنا أبدًا قياسه.نحن عادة نقيس المسافة.نحن في كثير من الأحيان عد العشرات.

* في بعض الحالات ما أسميه المسافة الاسمية, ، قد نرغب بالفعل في "حساب" المسافة.على سبيل المثال، ربما نتعامل مع علامات الدول التي توضح المسافات إلى المدن، ونعلم أن تلك المسافات لا تحتوي أبدًا على أكثر من رقم عشري واحد (xxx.x كم).

ولم يذكر أحد ذلك

في الإعدادات الافتراضية ، لن تستخدم العوامات (System.Single) و الزوجي (System.Double) فحص الفائض في حين أن العشرية (النظام.

أعني

decimal myNumber = decimal.MaxValue;
myNumber += 1;

رميات OverflowException.

لكن هذه لا:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

والأعداد الصحيحة، كما ذكر، هي الأعداد الصحيحة. أنهم لا يستطيعون تخزين نقطة شيء، مثل 0.7، 0.42، و0.007. إذا كنت بحاجة إلى تخزين الأرقام التي ليست أرقام كاملة، كنت في حاجة الى نوع مختلف من متغير. يمكنك استخدام نوع مزدوج أو نوع تعويم. قمت بتعيين هذه الأنواع من المتغيرات حتى في بنفس الطريقة تماما: بدلا من استخدام كلمة int، اكتب double أو float. مثل هذا:

float myFloat;
double myDouble;

و(float هو اختصار ل "النقطة العائمة"، ويعني مجرد رقم بنقطة شيء في النهاية.)

والفرق بين الاثنين هو في حجم الأرقام التي يمكن أن تعقد. لfloat، هل يمكن أن يكون ما يصل الى 7 أرقام في رقم هاتفك. لdoubles، هل يمكن أن يكون ما يصل الى 16 أرقام. لنكون أكثر دقة، وهنا حجم الرسمي:

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

وfloat هو رقم 32 بت، وdouble هو رقم 64 بت.

وانقر نقرا مزدوجا فوق زر جديد للحصول على التعليمات البرمجية. أضف الأسطر الثلاثة التالية إلى رمز الزر الخاص بك:

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

ووقف البرنامج والعودة إلى إطار الترميز. تغيير هذا السطر:

myDouble = 0.007;
myDouble = 12345678.1234567;

وتشغيل البرنامج وانقر على زر مزدوجة الخاصة بك. مربع الرسالة يعرض عدد صحيح. إضافة رقم آخر في نهاية المطاف، رغم ذلك، وC # سوف تكمل مرة أخرى أعلى أو لأسفل. إن المغزى هو اذا كنت تريد الدقة وتوخي الحذر من التقريب!

  1. يمكن تقسيم Double وfloat على عدد صحيح صفر دون استثناء في كل من وقت التجميع والتشغيل.
  2. لا يمكن قسمة العدد العشري على عدد صحيح صفر.سوف يفشل التجميع دائمًا إذا قمت بذلك.

لقد كان هذا موضوعًا مثيرًا للاهتمام بالنسبة لي، حيث واجهنا اليوم خطأً صغيرًا سيئًا decimal وجود دقة أقل من أ float.

في كود C# الخاص بنا، نقرأ القيم الرقمية من جدول بيانات Excel، ونحولها إلى ملف decimal, ، ثم أرسل هذا decimal العودة إلى الخدمة للحفظ في ملف خادم قاعدة البيانات قاعدة البيانات.

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

الآن ل الكل تقريبا من قيم Excel لدينا، نجح هذا الأمر بشكل جميل.ولكن بالنسبة للبعض، فإن قيم Excel صغيرة جدًا، وذلك باستخدام decimal.TryParse فقدت القيمة تماما.أحد الأمثلة على ذلك هو

  • قيمة الخلية = 0.00006317592

  • Decimal.TryParse(cellValue.ToString(), out value); // سيعود 0

كان الحل الغريب هو تحويل قيم Excel إلى ملف double أولاً، ثم إلى أ decimal:

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    …
}

بالرغم من double لديه دقة أقل من أ decimal, ، وهذا يضمن في الواقع التعرف على الأعداد الصغيرة.لسبب ما، double.TryParse كان في الواقع قادرًا على استرداد هذه الأرقام الصغيرة، في حين decimal.TryParse سوف يضعهم على الصفر.

غريب.غريب جدا.

  • يطفو:±1.5 × 10^-45 إلى ±3.4 × 10^38 (~7 أرقام مهمة
  • مزدوج:±5.0 × 10^-324 إلى ±1.7 × 10^308 (15-16 رقم مهم)
  • عدد عشري:±1.0 × 10^-28 إلى ±7.9 × 10^28 (28-29 رقم مهم)

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

ووعشري، مزدوجة، وتعويم أنواع متغيرة تختلف في الطريقة التي تخزين القيم. الدقة هو الفرق الرئيسي حيث تعويم هو الدقة واحد (32 بت) العائمة نقطة نوع البيانات، انقر نقرا هو الدقة المزدوجة (64 بت) العائمة نوع بيانات نقطة وعشري هو 128 بت العائمة نوع بيانات نقطة.

وتعويم - 32 بت (7 أرقام)

ومزدوجة - 64 بت (15-16 أرقام)

وعشري - 128 بت (28-29 الأرقام المعنوية)

وللمزيد حول ... الفرق بين عشري، تعويم ومزدوجة

والمشكلة مع كل هذه الأنواع هي أن بعض قائما الدقة ويمكن أن تحدث هذه المشكلة مع الأرقام العشرية صغيرة كما في المثال التالي

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

والسؤال: ما هي قيمة لا تحتوي على منفاخ متغير

والجواب: على جهاز 32 بت يحتوي على منفاخ TRUE !!!

إذا كنت استبدال مزدوجة من قبل عشري، منفاخ يحتوي FALSE وهو إجابة جيدة.

في ضعف، والمشكلة هي أن fMean-fDelta = 1.09999999999 وهو أقل أن 1.1.

والحذر: أعتقد أن نفس المشكلة يمكن موجود بالتأكيد لعدد آخر بسبب عشري ليست سوى مزدوج مع أعلى دقة ودقة دائما حد

.

في الواقع، مزدوجة، تعويم وعشري تتوافق مع عشري ثنائي في كوبول!

ومن المؤسف أن أنواع رقمية أخرى نفذت في كوبول لا وجود لها في صافي. بالنسبة لأولئك الذين لا يعرفون كوبول، توجد في كوبول التالية نوع عددي

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

بكلمات بسيطة:

  1. تختلف أنواع المتغيرات Decimal وDouble وFloat في طريقة تخزين القيم.
  2. الدقة هي الفرق الرئيسي (لاحظ أن هذا ليس هو الفرق الوحيد) حيث يطفو هو نوع بيانات النقطة العائمة بدقة واحدة (32 بت)، مزدوج هو نوع بيانات النقطة العائمة مزدوج الدقة (64 بت) و عدد عشري هو نوع بيانات النقطة العائمة 128 بت.
  3. الجدول الملخص:

/==========================================================================================
    Type       Bits    Have up to                   Approximate Range 
/==========================================================================================
    float      32      7 digits                     -3.4 × 10 ^ (38)   to +3.4 × 10 ^ (38)
    double     64      15-16 digits                 ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
    decimal    128     28-29 significant digits     ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
يمكنك قراءة المزيد هنا, يطفو, مزدوج, ، و عدد عشري.

والفرق الرئيسي بين كل هذه هي الدقة.

وfloat هو رقم 32-bit، double هو رقم 64-bit وdecimal هو رقم 128-bit.

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