سؤال

وأنا لا نرى النتيجة أتوقع مع Math.Round.

return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97

وكما فهمت MidpointRounding.ToEven، 5 في موقف الألف يجب أن يسبب الإخراج ليكون 99.96. أليس هذا هو الحال؟

وأنا حتى حاولت ذلك، ولكنه عاد 99.97 أيضا:

return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100;

وماذا أنا في عداد المفقودين

وشكرا!

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

المحلول

وأنت لست في الواقع في منتصف. يشير MidpointRounding.ToEven أنه إذا كان لديك رقم <القوي> 99،965 ، أو أي 99.96500000 [الخ.]، <م> ثم ستحصل 99.96. ولما كان عدد كنت تمر لMath.Round فوق هذا نقطة الوسط، انها ألقت القبض على.

إذا كنت تريد رقمك لتقريب وصولا الى 99.96، قيام بذلك:

// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);

ومهلا، وهنا وظيفة صغيرة في متناول اليد لتفعل ما سبق للحالات العامة:

// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
    double multiplier = Math.Pow(10.0, digits + 1);
    double truncated = Math.Truncate(value * multiplier) / multiplier;
    return Math.Round(truncated, digits, mode);
}

نصائح أخرى

ووجولات فقط إلى 99.96 إذا كنت في مرحلة منتصف نفسها، أي 99.965:

C:\temp>ipy
IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import Math, MidpointRounding
>>> Math.Round(99.9651, 2, MidpointRounding.ToEven)
99.97
>>> Math.Round(99.965, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.9649, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.975, 2, MidpointRounding.ToEven)
99.98
>>>

وقيمة MidpointRounding لا يأتي إلا في اللعب عندما كنت في محاولة لتقريب القيمة التي الرقم الأقل أهمية هو بالضبط 5. وبعبارة أخرى، سيكون القيمة التي سيتم 99.965 للحصول على نتيجة المطلوب . وبما أن هذا ليس هو الحال هنا، كنت ببساطة مراقبة آلية التقريب القياسية. انظر الصفحة MSDN للحصول على مزيد من المعلومات.

وهنا النتائج أن يلقي بعض الضوء على هذا الموضوع:

Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven);      // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96

وهذا هو بالضبط منتصف 5 ... لا 535789، 499999 لا.

وبدا والتقريب نقطة الوسط في إلا إذا كانت القيمة بين الخاص حالتين.

في قضيتك، انها ليست "5"، انها "535 ..."، لذلك فمن أكبر من نقطة الوسط، والروتين إلى 0.96. للحصول على سلوك تتوقع الخاص بك، وكنت بحاجة إلى trunctate إلى العشرية الثالثة، ثم جولة باستخدام MidpointRounding.ToEven.

وMath.Round "لتقريب القيمة العشرية لعدد محدد من الأرقام الكسرية". عندما التقريب 99.96500000،2 جولات إلى 99.96 و99،96500001-99،67. ومن تقريب القيمة الكاملة.

إذا كان لي، وأنا لن تستخدم Math.Round()، لأن ذلك ليس هو ما تحاول تحقيقه.

وهذا ما أود القيام به:

double num = 99.96535789;
double percentage = Math.Floor(100 * num) / 100;  

ما هو أسهل بكثير من قراءة وأكثر من نهج الرياضي.
I ضرب عدد من 100، والآن لدي 9996.535789.
ثم الكلمة، والذي يختلف متميز من التقريب، للعودة أصغر عدد صحيح أقرب إلى الرقم، للحصول على 9996.
I ثم القسمة على 100 للحصول على 99.96 المطلوبة.

وP.S.
الطابق هو عكس <م> سقف ، والتي ترجع أكبر عدد صحيح الأقرب إلى الرقم.
لذا، فإن سقف 9996.535789 هو 9997.
كلاهما مختلف عن التقريب إلى أي نقطة عشرية، والتي ترجع في الواقع أقرب عدد صحيح لعدد، سواء كان أصغر أو أكبر - أيهما أقرب. هذا هو السبب الذي كانوا يحصلون على 99.97 عند استخدامها <م> التقريب .

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