سؤال

ولدي مدونة، وأنا لا أفهم ذلك. أنا تطوير تطبيق الذي الدقة في غاية الأهمية. ولكنه ليس من المهم ل. NET، لماذا؟ أنا لا أعرف.

double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

ولكن يظهر مربع الرسالة: 3.5 الرجاء مساعدتي، شكرا لك.

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

المحلول

هل يمكن أن يكون من الدقة، ولكن ذلك يعتمد على ماذا تريد أن تفعل. إذا قمت بوضع التالية في تطبيق وحدة التحكم:

double a = 1e-20;
Console.WriteLine(" a  = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);

decimal b = 1e-20M;
Console.WriteLine(" b  = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);

وسوف تحصل

 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

ولكن لاحظ أن وظيفة Pow، مثل كل شيء تقريبا في فئة الرياضيات، يستغرق سوى الزوجي:

double Pow(double x, double y);

ولذا لا يمكن أن تأخذ جيب من عشري (آخر ثم بتحويله إلى مضاعفة)

وانظر أيضا هذه مسألة .

نصائح أخرى

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

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

.

والدقة لDouble هو 15 أرقام (17 رقما داخليا). القيمة التي كنت تحسب مع Math.Pow صحيحة، ولكن عند إضافته إلى value انها مجرد صغيرة جدا لإحداث فرق.

وتحرير:
A عشري يمكن التعامل مع هذا الدقة، ولكن ليس الحساب. إذا كنت تريد أن الدقة، ما عليك القيام به الحساب، ثم تحويل كل قيمة لDecimal قبل إضافتها معا:

double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());

وأو استخدام عشري اكتب بدلا من الضعف.

والدقة مزدوجة يعني أنها يمكن أن تعقد 15-16 أرقام. 3.5 + 1E 20 = 21 أرقام. لا يمكن أن تكون ممثلة في precicion مزدوج. يمكنك استخدام نوع آخر مثل عشري.

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