c# - كيف يمكنني تحويل قيمة مزدوجة إلى أقرب قيمة صحيحة؟




rounding (6)

يمكنك أيضًا استخدام الوظيفة:

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

اعتمادا على الهندسة المعمارية عدة مرات أسرع.

كيف تقوم بتحويل مزدوج إلى أقرب int؟


استخدم Math.round() ، ربما بالاقتران مع MidpointRounding.AwayFromZero

على سبيل المثال:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3

double d;
int rounded = (int)Math.Round(d);

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

عند التحويل إلى int ، ما عليك سوى إضافة .5 إلى القيمة قبل الإهمال. بما أن الإهمال إلى int يسقط دومًا إلى العدد الأقل (على سبيل المثال (int) 1.7 = 1) ، إذا كان رقمك هو 0.5 أو أعلى ، فإن إضافة .5 سيجلبه إلى الرقم التالي ويجب أن يعيدك downcast إلى int القيمة الصحيحة . (على سبيل المثال (int) (1.8 + .5) = 2)

آمل أن تكون هذه الإجابة مفيدة لأي شخص.


double d = 1.234;
int i = Convert.ToInt32(d);

Reference

يعالج التقريب مثل:

تقريب إلى أقرب عدد صحيح 32 بت موقعة. إذا كانت القيمة في منتصف الطريق بين رقمين صحيحين ، يتم إرجاع الرقم الزوجي ؛ أي ، يتم تحويل 4.5 إلى 4 ، ويتم تحويل 5.5 إلى 6.


حسنا ، لقد قرأت جميع الإجابات وكانوا حول استخدام الترميز أو واحد عن التسلسل الذي يسقط بديلين غير مزايدات.

انها سيئة عندما تأتي السلسلة ، على سبيل المثال ، من SQL Server حيث تم بناءه من صفيف تخزين البايت ، على سبيل المثال ، تجزئة كلمة المرور. إذا قمنا بإسقاط أي شيء منه ، فسوف يقوم بتخزين تجزئة غير صالحة ، وإذا أردنا تخزينها في XML ، فنحن نريد أن نتركها سليمة (لأن كاتب XML يسقط استثناءً عن أي بديل غير مزاوج يجده).

لذلك أستخدم ترميز Base64 لصفائف البايتات في مثل هذه الحالات ، ولكن يا للهول ، يوجد على الإنترنت حل واحد لهذا في C # ، ولديه خلل فيه وهو طريقة واحدة فقط ، لذلك أصلحت الخطأ وأعدت كتابتي إجراء. أنت هنا ، موظفو Google المستقبليون:

public static byte[] StringToBytes(string str)
{
    byte[] data = new byte[str.Length * 2];
    for (int i = 0; i < str.Length; ++i)
    {
        char ch = str[i];
        data[i * 2] = (byte)(ch & 0xFF);
        data[i * 2 + 1] = (byte)((ch & 0xFF00) >> 8);
    }

    return data;
}

public static string StringFromBytes(byte[] arr)
{
    char[] ch = new char[arr.Length / 2];
    for (int i = 0; i < ch.Length; ++i)
    {
        ch[i] = (char)((int)arr[i * 2] + (((int)arr[i * 2 + 1]) << 8));
    }
    return new String(ch);
}




c# rounding