আমি কীভাবে নিকটতম 0.5 তে গোল করব?


103

আমাকে রেটিংগুলি প্রদর্শন করতে হবে এবং তার জন্য আমার নীচের হিসাবে বর্ধন প্রয়োজন:

সংখ্যাটি যদি 1.0 হয় তবে এটি 1 এর সমান হতে হবে
যদি সংখ্যাটি 1.1 সমান 1 টি
হওয়া উচিত
তবে সংখ্যাটি 1 এর সমান হতে হবে যদি সংখ্যাটি 1.3 হয় 1.5 এর সমান হতে হবে
যদি সংখ্যাটি 1.4 এর সমান হতে হবে 1.5.০
সংখ্যাটি ১.৫ এর সমান হতে হবে 1.5 এর সাথে
যদি সংখ্যাটি 1.6 হয় 1.5 এর সমান হতে হবে
যদি সংখ্যাটি 1.7 হয় 1.5 এর সমান হওয়া উচিত
যদি সংখ্যাটি 1.8 হয় 2.0 এর সমান হতে হবে
যদি সংখ্যাটি 1.9 এর সমান হতে হবে ২.০
সংখ্যাটি যদি 2.0 হয় তবে এটি 2.0 এর সমান হতে হবে
যদি সংখ্যাটি 2.1 হয় তবে 2.0 এর সমান হওয়া উচিত
...

প্রয়োজনীয় মানগুলি গণনা করার কোনও সহজ উপায় আছে?


"এবং তাই ..." এর মধ্যে সীমাবদ্ধ সংখ্যাগুলি সর্বাধিক উপস্থাপিত মানের নিকটে অন্তর্ভুক্ত থাকে?
chux - মনিকা

উত্তর:


210

আপনার রেটিংটি 2 দিয়ে গুণ করুন, তারপরে ব্যবহার করে গোল করুন Math.Round(rating, MidpointRounding.AwayFromZero), তারপরে সেই মানটিকে 2 দিয়ে ভাগ করুন।

Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2


4
আমার ডামিদের জন্য টাইপ করার দরকার নেই, স্মার্টের জন্য টাইপ করতে হবে
নিল এন

4
সঠিক না! পূর্ণসংখ্যা ওভারফ্লো সম্পর্কে কি! আপনি সম্ভাব্য পূর্ণসংখ্যার মাত্র অর্ধেক গণনা করতে পারেন।
এলাজার লাইবোভিচ

4
@ এলাজার - আপনি যদি 1,073,741,823 তম স্থানে স্থান পেতে পারেন তবে আমি একক ব্যবহারের ক্ষেত্রে ভাবতে পারি না যেখানে আপনি "দেড় বিলিয়ন" বা "এক বিলিয়ন এক" যদি যত্নশীল হন - যদি এটি সত্যিই সমস্যা হয় তারপরে র‌্যাঙ্কিং স্কিমের সাথে সহজাত কিছু ত্রুটি রয়েছে :)
জন রাশ

4
প্রথমে ভাগ করুন, তারপরে গুণ করুন। এটি ওভারফ্লো সমস্যাটি দূর করবে, এবং আপনাকে একটি স্বেচ্ছাসেবী সংখ্যায় গোল করার অনুমতি দেবে।
বেনজল

8
@ বেনজল, প্রথমে বিভাজন এবং তারপরে রাউন্ডিং এটিকে অর্ধেকের গুণকের চেয়ে 2 এর নিকটতম গুণকের দিকে নিয়ে যাবে। সঠিক না.
নচট

68

2 দিয়ে গুণান, বৃত্তাকার, তারপর 2 দিয়ে ভাগ করুন

আপনি যদি নিকটতম চতুর্থাংশ চান, 4 দ্বারা গুণান, 4 দ্বারা ভাগ করুন, ইত্যাদি


16

এখানে আমি লিখেছি এমন কয়েকটি পদ্ধতি রয়েছে যা সর্বদা কোনও মান পর্যন্ত চূড়ান্ত হয়।

public static Double RoundUpToNearest(Double passednumber, Double roundto)
{
    // 105.5 up to nearest 1 = 106
    // 105.5 up to nearest 10 = 110
    // 105.5 up to nearest 7 = 112
    // 105.5 up to nearest 100 = 200
    // 105.5 up to nearest 0.2 = 105.6
    // 105.5 up to nearest 0.3 = 105.6

    //if no rounto then just pass original number back
    if (roundto == 0)
    {
        return passednumber;
    }
    else
    {
        return Math.Ceiling(passednumber / roundto) * roundto;
    }
}

public static Double RoundDownToNearest(Double passednumber, Double roundto)
{
    // 105.5 down to nearest 1 = 105
    // 105.5 down to nearest 10 = 100
    // 105.5 down to nearest 7 = 105
    // 105.5 down to nearest 100 = 100
    // 105.5 down to nearest 0.2 = 105.4
    // 105.5 down to nearest 0.3 = 105.3

    //if no rounto then just pass original number back
    if (roundto == 0)
    {
        return passednumber;
    }
    else
    {
        return Math.Floor(passednumber / roundto) * roundto;
    }
}

2

বিভিন্ন বিকল্প আছে। পারফরম্যান্স যদি উদ্বেগজনক হয় তবে বড় লুপে কোনটি দ্রুত কাজ করে তা পরীক্ষা করে দেখুন।

double Adjust(double input)
{
    double whole = Math.Truncate(input);
    double remainder = input - whole;
    if (remainder < 0.3)
    {
        remainder = 0;
    }
    else if (remainder < 0.8)
    {
        remainder = 0.5;
    }
    else
    {
        remainder = 1;
    }
    return whole + remainder;
}

এটি কাজ করা উচিত, তবে এটি প্রদত্ত কিছু সমাধানের মতো মার্জিত নয়। গুণাগুণ এবং সিস্টেম লাইব্রেরি ব্যবহার সেক্সি।
ক্যাপচার্যাগ

পারফরম্যান্স সাধারণত আরও গুরুত্বপূর্ণ, এবং এটি গুণ এবং বিভাগ সমাধানগুলির চেয়ে কম সময় গ্রহণ করতে পারে।
জন ফিশার

4
এই কোডটি সঠিক নয়। যেহেতু ডাবলসের সাথে গাণিতিকের সাধারণত কিছুটা ছোট গোলাকৃতি ত্রুটি থাকে, তাই 4.8 - 4.0 এর মতো একটি অপারেশন উদাহরণস্বরূপ 0.799999 দিতে পারে ... এক্ষেত্রে উপরের কোডটি 4.5.৪ এর মতো হবে। এছাড়াও ম্যাথের পরিবর্তে ম্যাথ.ফ্লুর ব্যবহার করা ভাল r ট্রান্সকেট, কারণ এখন negativeণাত্মক সংখ্যাগুলি সুস্পষ্টভাবে বৃত্তাকার নয়। আমি গ্রহণযোগ্য উত্তর পছন্দ করি, কারণ এটি বাস্তবায়ন ত্রুটিগুলি সহজ এবং কম প্রবণ one
অ্যাকপিট্রিডে

1
decimal d = // your number..

decimal t = d - Math.Floor(d);
if(t >= 0.3d && t <= 0.7d)
{
    return Math.Floor(d) + 0.5d;
}
else if(t>0.7d)
    return Math.Ceil(d);
return Math.Floor(d);

1

আপনার কাছ থেকে মনে হয় আপনার নিকটতম 0.5 টি পর্যন্ত গোল করতে হবে। আমি roundসি # এপিআই- এর কোনও সংস্করণ দেখতে পাচ্ছি না যা এটি করে (এক সংস্করণটি দশমিক সংখ্যা নিয়ে চলেছে, যা একই জিনিস নয়)।

ধরে নিলাম আপনাকে কেবল দশম সংখ্যা পূর্ণসংখ্যার সাথে ডিল করতে হবে, এটি গণনা করার পক্ষে যথেষ্ট round (num * 2) / 2। আপনি যদি ইচ্ছামত সুনির্দিষ্ট দশমিক ব্যবহার করেন তবে তা আরও জটিল হয়ে ওঠে। আসুন আশা করি আপনি করবেন না।


0

এই সমস্যাটি নিয়ে আমারও সমস্যা ছিল। আমি মূলত অ্যাকশনসক্রিপ in.০ এ কোড করি যা অ্যাডোব ফ্ল্যাশ প্ল্যাটফর্মের জন্য বেস কোডিং, তবে ভাষাগুলিতে সাদৃশ্য রয়েছে:

আমি যে সমাধানটি নিয়ে এসেছি তা হ'ল:

//Code for Rounding to the nearest 0.05
var r:Number = Math.random() * 10;  // NUMBER - Input Your Number here
var n:int = r * 10;   // INTEGER - Shift Decimal 2 places to right
var f:int = Math.round(r * 10 - n) * 5;// INTEGER - Test 1 or 0 then convert to 5
var d:Number = (n + (f / 10)) / 10; //  NUMBER - Re-assemble the number

trace("ORG No: " + r);
trace("NEW No: " + d);

যে প্রায় কাছাকাছি এটা. 'নম্বর' এবং 'পূর্ণসংখ্যার' ব্যবহার এবং সেগুলি কীভাবে প্রক্রিয়া করা হচ্ছে তা নোট করুন।

শুভকামনা!


0
Public Function Round(ByVal text As TextBox) As Integer
    Dim r As String = Nothing
    If text.TextLength > 3 Then
        Dim Last3 As String = (text.Text.Substring(text.Text.Length - 3))
        If Last3.Substring(0, 1) = "." Then
            Dim dimcalvalue As String = Last3.Substring(Last3.Length - 2)
            If Val(dimcalvalue) >= 50 Then
                text.Text = Val(text.Text) - Val(Last3)
                text.Text = Val(text.Text) + 1
            ElseIf Val(dimcalvalue) < 50 Then
                text.Text = Val(text.Text) - Val(Last3)
            End If
        End If
    End If
    Return r
End Function

5
এই কোডটি প্রশ্ন # টি হিসাবে সি # এর মতো দেখায় না। এটার কাজ কি? দয়া করে অনির্দিষ্ট ভাষায় কেবলমাত্র একগুচ্ছ কোডের চেয়ে কিছু ব্যাখ্যা সরবরাহ করুন।
অ্যাড্রিয়ান এইচএইচ এইচ

-1

এটি করার সঠিক উপায় হ'ল:

  public static Decimal GetPrice(Decimal price)
            {
                var DecPrice = price / 50;
                var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero);
                var finalPrice = roundedPrice * 50;

                return finalPrice;

            }

-1

জন রাশ যে জবাব দিয়েছিল তা উত্তরে রোসদী কাসিমের মন্তব্য থেকে এই উত্তর নেওয়া হয়েছে।

জন এর উত্তর কাজ করে কিন্তু একটি ওভারফ্লো সম্ভাবনা আছে।

রোজদির কোডটির আমার সংস্করণটি এখানে:

এটি ব্যবহার করা সহজ করার জন্য আমি এটি একটি এক্সটেনশনে রেখেছি। এক্সটেনশনটি প্রয়োজনীয় নয় এবং ইস্যু ছাড়াই একটি ফাংশন হিসাবে ব্যবহার করা যেতে পারে।

<Extension>
Public Function ToHalf(value As Decimal) As Decimal
    Dim integerPart = Decimal.Truncate(value)
    Dim fractionPart = value - Decimal.Truncate(integerPart)
    Dim roundedFractionPart = Math.Round(fractionPart * 2, MidpointRounding.AwayFromZero) / 2
    Dim newValue = integerPart + roundedFractionPart
    Return newValue
End Function

এর পরে ব্যবহারটি হবে:

Dim newValue = CDec(1.26).ToHalf

এটি 1.5 ফিরে আসবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.