मैं निकटतम 0.5 में कैसे गोल कर सकता हूं?


102

मुझे रेटिंग प्रदर्शित करनी है और इसके लिए मुझे वेतन वृद्धि की आवश्यकता है:

यदि संख्या १.० है तो १ के बराबर होना चाहिए।
यदि संख्या १.१ है तो १ के बराबर होना चाहिए।
यदि संख्या १.२ है तो १ के बराबर होना चाहिए।
यदि १.३ है तो १.५ के बराबर होना चाहिए।
यदि संख्या १.४ के बराबर होनी चाहिए तो १.५
यदि संख्या १.५ है तो १.५ के बराबर होना चाहिए।
यदि १.६ है तो १.५ के बराबर होना चाहिए। यदि संख्या १. should है तो १.५ के बराबर
होना चाहिए।
यदि संख्या १. should हो
तो २.० के बराबर होना चाहिए। यदि संख्या १.९ के बराबर होनी चाहिए 2.0
यदि संख्या 2.0 है तो 2.0 के बराबर होना चाहिए।
यदि संख्या 2.1 है
तो 2.0 के बराबर होना चाहिए और इसी तरह ...

क्या आवश्यक मूल्यों की गणना करने का एक सरल तरीका है?


"और इसी तरह ..." क्या परिमित संख्याओं को अधिकतम प्रतिनिधित्व मूल्य के करीब शामिल करता है?
chux -

जवाबों:


206

अपनी रेटिंग को 2 से गुणा करें, फिर राउंड का उपयोग करें Math.Round(rating, MidpointRounding.AwayFromZero), फिर उस मान को 2 से विभाजित करें।

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


4
मुझे डमी के लिए टाइप करने की आवश्यकता नहीं है, मुझे स्मार्टी के लिए टाइपिंग की आवश्यकता है
नील एन

3
पूरा नहीं! पूर्णांक अतिप्रवाह के बारे में क्या! आप संभावित पूर्णांकों में से केवल आधे की गणना कर सकते हैं।
एलजार लीबोविच

2
@ इज़ार - अगर आपको 1,073,741,823 वें स्थान पर रखा जा सकता है, तो मैं एक भी उपयोग के मामले के बारे में नहीं सोच सकता हूँ जहाँ आप परवाह करेंगे कि क्या यह "एक बिलियन डेढ़" या "एक बिलियन एक" है - यदि यह वास्तव में एक समस्या है फिर रैंकिंग योजना के साथ स्वाभाविक रूप से कुछ गड़बड़ है :)
जॉन राश

4
पहले विभाजित करें, फिर गुणा करें। यह अतिप्रवाह की समस्या को समाप्त करेगा, और आपको एक मनमानी संख्या के लिए भी अनुमति देगा।
बेंजोल

8
@ बैंजोल, पहले विभाजित करना और फिर राउंडिंग करने से यह 2 के निकटतम कारक के बजाय एक आधे के कारक के रूप में गोल हो जाएगा। गलत।
Nacht

67

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;
}

यह काम करना चाहिए, लेकिन यह केवल कुछ समाधानों के रूप में सुरुचिपूर्ण नहीं है। गुणा करना और सिस्टम लाइब्रेरी का उपयोग करना सिर्फ सेक्सी है।
कैप्टनक्रिग

प्रदर्शन आमतौर पर अधिक महत्वपूर्ण होता है, और यह गुणा और विभाजन समाधानों की तुलना में कम समय ले सकता है।
जॉन फिशर

3
यह कोड सही नहीं है। चूंकि अंकगणित में युगल के साथ आमतौर पर कुछ छोटी गोल करने की त्रुटियां होती हैं, इसलिए 4.8 - 4.0 जैसे एक ऑपरेशन उदाहरण के लिए 0.799999 दे सकता है ... इस स्थिति में ऊपर का कोड 4.5 होगा। इसके अलावा बेहतर होगा मैथ का इस्तेमाल करें। मैथ की जगह करें। क्रैंक करें, क्योंकि अभी नेगेटिव नंबर्स को पूरी तरह से गोल नहीं किया गया है। मैं स्वीकृत उत्तर को पसंद करता हूं, क्योंकि यह कार्यान्वयन की त्रुटियों के लिए सरल और कम प्रवण है।
एक्सीपिट्रिडे

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 पर चक्कर लगाने की आवश्यकता है। मुझे roundC # API का कोई भी संस्करण दिखाई नहीं देता है जो ऐसा करता है (एक संस्करण कई दशमलव अंकों को गोल करने के लिए लेता है, जो कि एक ही बात नहीं है)।

यह मानते हुए कि आपको केवल दसवीं के पूर्णांक संख्या से निपटना है, यह गणना के लिए पर्याप्त है round (num * 2) / 2। यदि आप मनमाने ढंग से सटीक दशमलव का उपयोग कर रहे हैं, तो यह मुश्किल हो जाता है। चलो आशा करते हैं कि आप नहीं करेंगे।


0

मुझे इस समस्या से भी कठिनाई थी। मैं मुख्य रूप से Actionscript 3.0 में कोड करता हूं जो कि Adobe Flash प्लेटफ़ॉर्म के लिए आधार कोडिंग है, लेकिन भाषाओं में simularities हैं:

जो समाधान मैं लेकर आया, वह निम्नलिखित है:

//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);

तो इतना ही है। The नंबर ’और of इंटेगर’ के उपयोग और उनके संसाधित होने के तरीके पर ध्यान दें।

शुभ लाभ!


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

4
यह कोड प्रश्न में वांछित # जैसा नहीं दिखता है। यह क्या करता है? कृपया अनिर्दिष्ट भाषा में कोड की एक गांठ के बजाय कुछ स्पष्टीकरण प्रदान करें।
AdrianHHH

-1

ऐसा करने का सही तरीका है:

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

                return finalPrice;

            }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.