गोलाई के बिना दो दशमलव स्थानों को काटें


107

आइए कहते हैं कि मेरे पास 3.4679 का मान है और 3.46 चाहते हैं, मैं दो दशमलव स्थानों पर कैसे घूम सकता हूं जो बिना गोल किए?

मैंने निम्नलिखित कोशिश की है, लेकिन तीनों ने मुझे 3.47 दिए:

void Main()
{
    Console.Write(Math.Round(3.4679, 2,MidpointRounding.ToEven));
    Console.Write(Math.Round(3.4679, 2,MidpointRounding.AwayFromZero));
    Console.Write(Math.Round(3.4679, 2));
}

यह 3.46 देता है, लेकिन अभी कुछ गंदा लगता है:

void Main()
{
    Console.Write(Math.Round(3.46799999999 -.005 , 2));
}
c#  math  rounding 

जवाबों:


151
value = Math.Truncate(100 * value) / 100;

इस बात से सावधान रहें कि इन जैसे अंशों को फ्लोटिंग पॉइंट में सही ढंग से दर्शाया नहीं जा सकता है।


12
अपने मूल्यों के लिए दशमलव का उपयोग करें और यह उत्तर काम करेगा। यह हमेशा किसी भी अस्थायी बिंदु प्रतिनिधित्व में काम करने की संभावना नहीं है।
ड्रिस

1
इससे मुझे आश्चर्य होता है कि क्या फ़्लोटिंग पॉइंट लिटरल में गोलाई दिशा को निर्दिष्ट करना संभव है। Hmmmm।
183 पर स्टीव 314

प्रोग्रामर को यह बताने का कोई तरीका होना चाहिए कि इस धारणा के साथ गणना करना कि एक संख्या 308 अंकों से अधिक स्टोर कर सकती है, सकल अनुचित है। डबल केवल स्टोर कर सकते हैं 15. अतिप्रवाह यहाँ एक विशेषता है, यह बुरी तरह से बह निकला।
हंस पसेंट

मुझे क्षमा करें, मुझे लगा कि "मान" दशमलव है।
नाईटकोड

54

C # में दशमलव को छोटा करने के वास्तविक-विश्व उपयोग के लिए एक पूर्ण कार्य करना अधिक उपयोगी होगा। यदि आप चाहते हैं तो इसे दशमलव विस्तार विधि में परिवर्तित किया जा सकता है:

public decimal TruncateDecimal(decimal value, int precision)
{
    decimal step = (decimal)Math.Pow(10, precision);
    decimal tmp = Math.Truncate(step * value);
    return tmp / step;
}

यदि आपको VB.NET की आवश्यकता है तो यह प्रयास करें:

Function TruncateDecimal(value As Decimal, precision As Integer) As Decimal
    Dim stepper As Decimal = Math.Pow(10, precision)
    Dim tmp As Decimal = Math.Truncate(stepper * value)
    Return tmp / stepper
End Function

फिर इसे इस तरह उपयोग करें:

decimal result = TruncateDecimal(0.275, 2);

या

Dim result As Decimal = TruncateDecimal(0.275, 2)

1
यह बड़ी संख्या में बह जाएगा।
नाईटकोड

1
नाइट कोडर में जोड़ने के लिए, आप अपने कार्य में मध्यस्थ के रूप में Int32 का उपयोग कर रहे हैं कि इस तथ्य के कारण overflows होगा। यदि आप वास्तव में इसे एक पूर्णांक में डालना चाहते हैं तो आपको Int64 का उपयोग करना चाहिए। सवाल यह होगा कि आप उस अतिरिक्त ओवरहेड को कभी भी क्यों उखाड़ना चाहेंगे क्योंकि ट्रंकट ने वैसे भी दशमलव को वापस कर दिया है। बस कुछ ऐसा करें: दशमलव चरण = (दशमलव) गणित। पाव (10, सटीक); वापसी Math.Truncate (चरण * मान) / चरण;
सेरेल एस्टरहुइज़न

मैंने कलाकारों को इंटीजर में गिरा दिया। मैंने उन्हें बेहतर पठनीयता और समझने के लिए अलग-अलग लाइनें छोड़ दीं कि फ़ंक्शन कैसे काम करता है।
Corgalore

27

मापांक ऑपरेटर का उपयोग करें:

var fourPlaces = 0.5485M;
var twoPlaces = fourPlaces - (fourPlaces % 0.01M);

परिणाम: 0.54


1
मुझे समझ में नहीं आता (पढ़ें: सत्यापित करने के लिए समय खर्च नहीं किया गया) इन सभी अन्य फैंसी समाधान, यह वही है जो मैं देख रहा था। धन्यवाद!
इसहाक बेकर

इस पर चल रहा है। नेट फिडली क्लिक से उत्पादन होता है 0.5400... डी। नेस्टरोव द्वारा जवाब का उत्पादन अपेक्षित था 0.54
ttugates

आपको पता चलता है, @ttugates, कि 0.54 और 0.5400 समान मूल्य हैं, ठीक है? इससे कोई फर्क नहीं पड़ता कि कितने शून्य का पालन किया जाता है जब तक कि / जब तक यह प्रदर्शित करने के लिए प्रारूपित करने का समय नहीं आता है - जिस स्थिति में, परिणाम ठीक से स्वरूपित होने पर समान होगा: $"{0.54m:C}"उत्पादन करता है "$0.54"और हां, $"{0.5400m:C}"उत्पादन करता है "$0.54"
लियोनार्ड लेविस

25

यूनिवर्सल और फास्ट विधि (बिना Math.Pow()/ गुणा) के लिए System.Decimal:

decimal Truncate(decimal d, byte decimals)
{
    decimal r = Math.Round(d, decimals);

    if (d > 0 && r > d)
    {
        return r - new decimal(1, 0, 0, false, decimals);
    }
    else if (d < 0 && r < d)
    {
        return r + new decimal(1, 0, 0, false, decimals);
    }

    return r;
}

4
मैंने अन्य उत्तरों में उल्लिखित सभी परीक्षणों के माध्यम से इसे चलाया और यह पूरी तरह से काम करता है। हैरानी की बात यह है कि अधिक upvotes नहीं है। यह ध्यान देने योग्य है कि दशमलव केवल 0 और 28 के बीच हो सकता है (संभवतः अधिकांश लोगों के लिए ठीक है)।
रिचर्ड रोड

1
मुझे भी वह पता हैं। यह सबसे अच्छा जवाब है। +1
ब्रानको दिमित्रिजेविक

1
शानदार जवाब, यह वही है जिसे मैं "बॉक्स के बाहर लगता हूं"
कहता हूं

23

अन्य उदाहरणों के साथ एक मुद्दा यह है कि वे इसे विभाजित करने से पहले इनपुट मूल्य को गुणा करते हैं। यहां एक किनारे का मामला है जिसे आप पहले, एक किनारे के मामले में गुणा करके दशमलव को ओवरफ्लो कर सकते हैं, लेकिन कुछ मैं भर आया हूं। यह भिन्न रूप से आंशिक भाग से निपटने के लिए सुरक्षित है:

    public static decimal TruncateDecimal(this decimal value, int decimalPlaces)
    {
        decimal integralValue = Math.Truncate(value);

        decimal fraction = value - integralValue;

        decimal factor = (decimal)Math.Pow(10, decimalPlaces);

        decimal truncatedFraction = Math.Truncate(fraction * factor) / factor;

        decimal result = integralValue + truncatedFraction;

        return result;
    }

मुझे पता है कि यह पुराना है लेकिन मैंने इस पर ध्यान दिया और जारी किया। आपके पास यहां मौजूद कारक एक इंट है और इसलिए यदि आप बड़ी संख्या में दशमलव स्थानों पर ट्रंकटेट कर रहे हैं (25 का कहना है) तो इसका परिणाम सटीक त्रुटि होगा। मैंने इसे कारक प्रकार को दशमलव में बदलकर तय किया।
TheKingDave

@ TheKingDave: शायद यह अप्रासंगिक है, लेकिन कारक के रूप में दशमलव नहीं हो सकता है इसलिए इसे लंबे समय तक सही तरीके से मॉडल करना बेहतर होगा?
इग्नासियो सोलर गार्सिया

मेरे लिए @SoMoS डेसीमल ने बेहतर काम किया क्योंकि इसने मुझे कारक के लिए उच्चतम भंडारण मूल्य दिए। यह अभी भी एक सीमा है, लेकिन यह मेरे आवेदन के लिए काफी बड़ा है। दूसरी ओर लंबे समय से मेरे आवेदन के लिए बड़ी संख्या में स्टोर करने में सक्षम नहीं था। उदाहरण के लिए यदि आप लंबे समय के साथ एक ट्रंकट (25) करते हैं तो कुछ अशुद्धि होगी।
द कैंगडेव

@TheKingDave सुझाव के अनुसार अधिक से अधिक स्थानों पर ट्रंकेशन की अनुमति देने के लिए अपडेट किया गया, धन्यवाद।
टिम लॉयड

6

मैं दशमलव संख्या के लिए समाधान छोड़ दूंगा।

यहाँ दशमलव के कुछ समाधान अतिप्रवाह के लिए प्रवण हैं (यदि हम एक बहुत बड़ी दशमलव संख्या पास करते हैं और विधि इसे गुणा करने की कोशिश करेगी)।

टिम लॉयड का समाधान अतिप्रवाह से सुरक्षित है लेकिन यह बहुत तेज़ नहीं है।

निम्नलिखित समाधान लगभग 2 गुना तेज है और इसमें अतिप्रवाह की समस्या नहीं है:

public static class DecimalExtensions
{
    public static decimal TruncateEx(this decimal value, int decimalPlaces)
    {
        if (decimalPlaces < 0)
            throw new ArgumentException("decimalPlaces must be greater than or equal to 0.");

        var modifier = Convert.ToDecimal(0.5 / Math.Pow(10, decimalPlaces));
        return Math.Round(value >= 0 ? value - modifier : value + modifier, decimalPlaces);
    }
}

[Test]
public void FastDecimalTruncateTest()
{
    Assert.AreEqual(-1.12m, -1.129m. TruncateEx(2));
    Assert.AreEqual(-1.12m, -1.120m. TruncateEx(2));
    Assert.AreEqual(-1.12m, -1.125m. TruncateEx(2));
    Assert.AreEqual(-1.12m, -1.1255m.TruncateEx(2));
    Assert.AreEqual(-1.12m, -1.1254m.TruncateEx(2));
    Assert.AreEqual(0m,      0.0001m.TruncateEx(3));
    Assert.AreEqual(0m,     -0.0001m.TruncateEx(3));
    Assert.AreEqual(0m,     -0.0000m.TruncateEx(3));
    Assert.AreEqual(0m,      0.0000m.TruncateEx(3));
    Assert.AreEqual(1.1m,    1.12m.  TruncateEx(1));
    Assert.AreEqual(1.1m,    1.15m.  TruncateEx(1));
    Assert.AreEqual(1.1m,    1.19m.  TruncateEx(1));
    Assert.AreEqual(1.1m,    1.111m. TruncateEx(1));
    Assert.AreEqual(1.1m,    1.199m. TruncateEx(1));
    Assert.AreEqual(1.2m,    1.2m.   TruncateEx(1));
    Assert.AreEqual(0.1m,    0.14m.  TruncateEx(1));
    Assert.AreEqual(0,      -0.05m.  TruncateEx(1));
    Assert.AreEqual(0,      -0.049m. TruncateEx(1));
    Assert.AreEqual(0,      -0.051m. TruncateEx(1));
    Assert.AreEqual(-0.1m,  -0.14m.  TruncateEx(1));
    Assert.AreEqual(-0.1m,  -0.15m.  TruncateEx(1));
    Assert.AreEqual(-0.1m,  -0.16m.  TruncateEx(1));
    Assert.AreEqual(-0.1m,  -0.19m.  TruncateEx(1));
    Assert.AreEqual(-0.1m,  -0.199m. TruncateEx(1));
    Assert.AreEqual(-0.1m,  -0.101m. TruncateEx(1));
    Assert.AreEqual(0m,     -0.099m. TruncateEx(1));
    Assert.AreEqual(0m,     -0.001m. TruncateEx(1));
    Assert.AreEqual(1m,      1.99m.  TruncateEx(0));
    Assert.AreEqual(1m,      1.01m.  TruncateEx(0));
    Assert.AreEqual(-1m,    -1.99m.  TruncateEx(0));
    Assert.AreEqual(-1m,    -1.01m.  TruncateEx(0));
}

2
मुझे यह "एक्स" प्रत्यय पसंद नहीं है। C # ओवरलोडिंग का समर्थन करता है, आपके Truncateतरीके को .net मूल लोगों के साथ मिलकर बनाया जाएगा, जिससे उपयोगकर्ता को एक सहज अनुभव मिलेगा।
Gqqnbig

1
आपका एल्गोरिथ्म कुछ गलत परिणाम देता है। डिफ़ॉल्ट मिडपॉइंटिंग मोड बैंकर की राउंडिंग है, जो निकटतम सम मान के लिए 0.5 राउंड करता है। Assert.AreEqual(1.1m, 1.12m.TruncateEx(1));इसके कारण विफल रहता है। यदि आप Math.Round कॉल में "सामान्य" गोलाई (AwayFromZero) को निर्दिष्ट करते हैं, तो Assert.AreEqual(0m, 0m.TruncateEx(1));विफल हो जाता है
जॉन सेनचैना

1
यदि आप उपयोग करते हैं MidpointRounding.AwayFromZeroऔर विशेष रूप से मान को संभालने के लिए विशेष रूप से कोड 0.
जॉन सींचना

1
जॉन सही है: 0m.TruncateEx (0) -1 में परिणाम जब तक 0 स्पष्ट रूप से नियंत्रित नहीं किया जाता है। इसी तरह -11 m.TruncateEx (0) -10 में परिणाम देता है जब तक कि MidpointRounding.AwayFromZero का उपयोग Math.Round के भीतर नहीं किया जाता है। उन संशोधनों के साथ अच्छी तरह से काम करने लगता है।
हो हो हो

1
AwayFromZero के लिए परिवर्तन और 0, -99999999999999999999999999999999m .runcateEx (0) के स्पष्ट परिणामों के साथ भी -99999999999999999999999998 में परिणाम है, इसलिए यह अभी भी कुछ मामलों में गिरने योग्य है।
हो हो हो

3

यह एक पुराना सवाल है, लेकिन कई खिलाड़ी बड़ी संख्या में अच्छा प्रदर्शन नहीं कर पाते हैं। मुझे लगता है कि डी। नेस्टरोव का उत्तर सबसे अच्छा है: मजबूत, सरल और तेज। मैं सिर्फ अपने दो सेंट जोड़ना चाहता हूं। मैंने दशमलव के साथ खेला और स्रोत कोड भी देखा । से public Decimal (int lo, int mid, int hi, bool isNegative, byte scale) निर्माता प्रलेखन

दशमलव संख्या के द्विआधारी प्रतिनिधित्व में 1-बिट संकेत, 96-बिट पूर्णांक संख्या और पूर्णांक संख्या को विभाजित करने के लिए उपयोग किया जाने वाला स्केलिंग कारक होता है और यह निर्दिष्ट करता है कि इसका कौन सा भाग दशमलव अंश है। स्केलिंग फैक्टर अनुमानित संख्या 10 है जो एक एक्सपोनेंट से 0 से 28 तक है।

यह जानकर, मेरा पहला दृष्टिकोण एक और बनाना था decimalजिसका पैमाना उन दशमलवों से मेल खाता है जिन्हें मैं त्यागना चाहता था, फिर इसे काटकर अंत में वांछित पैमाने के साथ एक दशमलव बनाएं।

private const int ScaleMask = 0x00FF0000;
    public static Decimal Truncate(decimal target, byte decimalPlaces)
    {
        var bits = Decimal.GetBits(target);
        var scale = (byte)((bits[3] & (ScaleMask)) >> 16);

        if (scale <= decimalPlaces)
            return target;

        var temporalDecimal = new Decimal(bits[0], bits[1], bits[2], target < 0, (byte)(scale - decimalPlaces));
        temporalDecimal = Math.Truncate(temporalDecimal);

        bits = Decimal.GetBits(temporalDecimal);
        return new Decimal(bits[0], bits[1], bits[2], target < 0, decimalPlaces);
    }

यह विधि डी। नेस्टरोव की तुलना में तेज़ नहीं है और यह अधिक जटिल है, इसलिए मैंने थोड़ा और अधिक खेला। मेरा अनुमान है कि एक परिचित बनाने decimalऔर दो बार बिट्स को पुनर्प्राप्त करने से यह धीमा हो रहा है। अपने दूसरे प्रयास में, मैंने Decimal.GetBits (Decimal d) विधि द्वारा वापस लौटाए गए घटकों में हेरफेर किया । विचार 10 से घटकों को आवश्यकतानुसार विभाजित करने और पैमाने को कम करने का है। कोड Decimal.InternalRoundFromZero (Ref Decimal d, int दशमलव) पद्धति पर आधारित (भारी) है ।

private const Int32 MaxInt32Scale = 9;
private const int ScaleMask = 0x00FF0000;
    private const int SignMask = unchecked((int)0x80000000);
    // Fast access for 10^n where n is 0-9        
    private static UInt32[] Powers10 = new UInt32[] {
        1,
        10,
        100,
        1000,
        10000,
        100000,
        1000000,
        10000000,
        100000000,
        1000000000
    };

    public static Decimal Truncate(decimal target, byte decimalPlaces)
    {
        var bits = Decimal.GetBits(target);
        int lo = bits[0];
        int mid = bits[1];
        int hi = bits[2];
        int flags = bits[3];

        var scale = (byte)((flags & (ScaleMask)) >> 16);
        int scaleDifference = scale - decimalPlaces;
        if (scaleDifference <= 0)
            return target;

        // Divide the value by 10^scaleDifference
        UInt32 lastDivisor;
        do
        {
            Int32 diffChunk = (scaleDifference > MaxInt32Scale) ? MaxInt32Scale : scaleDifference;
            lastDivisor = Powers10[diffChunk];
            InternalDivRemUInt32(ref lo, ref mid, ref hi, lastDivisor);
            scaleDifference -= diffChunk;
        } while (scaleDifference > 0);


        return new Decimal(lo, mid, hi, (flags & SignMask)!=0, decimalPlaces);
    }
    private static UInt32 InternalDivRemUInt32(ref int lo, ref int mid, ref int hi, UInt32 divisor)
    {
        UInt32 remainder = 0;
        UInt64 n;
        if (hi != 0)
        {
            n = ((UInt32)hi);
            hi = (Int32)((UInt32)(n / divisor));
            remainder = (UInt32)(n % divisor);
        }
        if (mid != 0 || remainder != 0)
        {
            n = ((UInt64)remainder << 32) | (UInt32)mid;
            mid = (Int32)((UInt32)(n / divisor));
            remainder = (UInt32)(n % divisor);
        }
        if (lo != 0 || remainder != 0)
        {
            n = ((UInt64)remainder << 32) | (UInt32)lo;
            lo = (Int32)((UInt32)(n / divisor));
            remainder = (UInt32)(n % divisor);
        }
        return remainder;
    }

मैंने कठोर प्रदर्शन परीक्षण नहीं किए हैं, लेकिन MacOS Sierra 10.12.6, 3,06 GHz Intel Core i3 प्रोसेसर और लक्ष्यीकरण .NetCore 2.1 पर यह विधि D. Nesterov's की तुलना में बहुत तेज़ प्रतीत होती है (क्योंकि मैं नंबर नहीं दूंगा। , जैसा कि मैंने उल्लेख किया है, मेरे परीक्षण कठोर नहीं हैं)। यह इस पर निर्भर करता है कि प्रदर्शन कोड लाभ जटिलता के लिए भुगतान करते हैं या नहीं, इसका मूल्यांकन करने के लिए इसे कौन लागू करता है।


मुझे सभी विचार और प्रयास के कारण उत्थान करना पड़ा। आपने नेस्टरोव को एक बेंचमार्क के रूप में सेट किया और जा रहे थे - हैट्स ऑफ।
एंड्रयूबेंजामिन



1

यहाँ एक विस्तार विधि है:

public static decimal? TruncateDecimalPlaces(this decimal? value, int places)
    {
        if (value == null)
        {
            return null;
        }

        return Math.Floor((decimal)value * (decimal)Math.Pow(10, places)) / (decimal)Math.Pow(10, places);

    } // end

0

यदि आप प्रदर्शन के बारे में बहुत अधिक चिंता नहीं करते हैं और आपका अंतिम परिणाम एक स्ट्रिंग हो सकता है, तो निम्नलिखित दृष्टिकोण अस्थायी सटीक मुद्दों के लिए लचीला होगा:

string Truncate(double value, int precision)
{
    if (precision < 0)
    {
        throw new ArgumentOutOfRangeException("Precision cannot be less than zero");
    }

    string result = value.ToString();

    int dot = result.IndexOf('.');
    if (dot < 0)
    {
        return result;
    }

    int newLength = dot + precision + 1;

    if (newLength == dot + 1)
    {
        newLength--;
    }

    if (newLength > result.Length)
    {
        newLength = result.Length;
    }

    return result.Substring(0, newLength);
}

6
दरअसल, हार्डकोडिंग '।' एक अच्छा विचार नहीं है, बेहतर उपयोग System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator [0]
डेविड Airapetyan

0

यहां TRUNC फ़ंक्शन का मेरा कार्यान्वयन है

private static object Tranc(List<Expression.Expression> p)
{
    var target = (decimal)p[0].Evaluate();

    // check if formula contains only one argument
    var digits = p.Count > 1
        ? (decimal) p[1].Evaluate()
        : 0;

    return Math.Truncate((double)target * Math.Pow(10, (int)digits)) / Math.Pow(10, (int)digits);
}

0

इस बारे में क्या?

Function TruncateDecimal2(MyValue As Decimal) As Decimal
        Try
            Return Math.Truncate(100 * MyValue) / 100
        Catch ex As Exception
            Return Math.Round(MyValue, 2)
        End Try
End Function

0

उपरोक्त समाधानों के अलावा, एक और तरीका है जिसे हम प्राप्त कर सकते हैं।

    decimal val=23.5678m,finalValue;

    //take the decimal part    
     int decimalPos = val.ToString().IndexOf('.');
     string decimalPart = val.ToString().Substring(decimalPosition+1,val.ToString().Length);
    //will result.56
   string wholePart=val.ToString().Substring(0,decimalPos-1);
   //concantinate and parse for decimal.
  string truncatedValue=wholePart+decimalPart;//"23.56"
  bool isDecimal=Decimal.tryParse(truncatedValue,out finalValue);//finalValue=23.56

0

कुछ शर्तों के तहत यह पर्याप्त हो सकता है।

मेरे पास उप-अंक = 0.0099999999999999999999999999M का एक दशमलव मान है जो प्रारूप में जाता है । उप-वर्ग: 0.010000 | के माध्यम से string.Format("{0:N6}", SubCent );और कई अन्य स्वरूपण विकल्प।

मेरी आवश्यकता उप-मूल्य को गोल करने के लिए नहीं थी, लेकिन हर अंक को लॉग न करें।

निम्नलिखित मेरी आवश्यकता को पूरा किया:

string.Format("SubCent:{0}|", 
    SubCent.ToString("N10", CultureInfo.InvariantCulture).Substring(0, 9));

जो स्ट्रिंग लौटाता है: | उप-सहायक: 0.0099999 |

एक पूर्णांक भाग वाले मान को समायोजित करने के लिए निम्नलिखित एक शुरुआत है।

tmpValFmt = 567890.0099999933999229999999M.ToString("0.0000000000000000000000000000");
decPt = tmpValFmt.LastIndexOf(".");
if (decPt < 0) decPt = 0;
valFmt4 = string.Format("{0}", tmpValFmt.Substring(0, decPt + 9));

जो स्ट्रिंग लौटाता है:

valFmt4 = "567890.00999999"

0

मैं एक स्ट्रिंग चर में दशमलव के बाद मूल्य को कम करने के लिए इस फ़ंक्शन का उपयोग कर रहा हूं

public static string TruncateFunction(string value)
    {
        if (string.IsNullOrEmpty(value)) return "";
        else
        {
            string[] split = value.Split('.');
            if (split.Length > 0)
            {
                string predecimal = split[0];
                string postdecimal = split[1];
                postdecimal = postdecimal.Length > 6 ? postdecimal.Substring(0, 6) : postdecimal;
                return predecimal + "." + postdecimal;

            }
            else return value;
        }
    }

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके।
निक 3500

0

यह जो मैंने किया है:

        c1 = a1 - b1;
        d1 = Math.Ceiling(c1 * 100) / 100;

दशमलव के ऊपर या नीचे गोल किए बिना दो इनपुट संख्याओं को घटाना। क्योंकि दूसरे उपाय मेरे काम नहीं आते। पता नहीं कि यह दूसरों के लिए काम करेगा, मैं इसे साझा करना चाहता हूं :) आशा है कि यह उन लोगों के लिए काम करता है जो मेरी जैसी समस्या का समाधान खोज रहे हैं। धन्यवाद

पुनश्च: मैं एक शुरुआत कर रहा हूँ ताकि इस पर कुछ इंगित करने के लिए स्वतंत्र महसूस हो। : D यह अच्छा है यदि आप वास्तव में पैसे के साथ काम कर रहे हैं, तो सेंट ठीक है? इसमें केवल 2 दशमलव स्थान हैं और इसे गोल करना एक नहीं है।


0
        public static void ReminderDigints(decimal? number, out decimal? Value,  out decimal? Reminder)
        {
            Reminder = null;
            Value = null;
            if (number.HasValue)
            {
                Value = Math.Floor(number.Value);
                Reminder = (number - Math.Truncate(number.Value));
            }
        }



        decimal? number= 50.55m;             
        ReminderDigints(number, out decimal? Value, out decimal? Reminder);

0
public static decimal TruncateDecimalPlaces(this decimal value, int precision)
    {
        try
        {
            step = (decimal)Math.Pow(10, precision);
            decimal tmp = Math.Truncate(step * value);
            return tmp / step;
        }
        catch (OverflowException)
        {
            step = (decimal)Math.Pow(10, -1 * precision);
            return value - (value % step);
        }
    }

-2

वास्तव में आप 3.4679 से 3.46 चाहते हैं। यह केवल वर्णों का प्रतिनिधित्व है। इसके अलावा गणित के कार्य से कोई लेना-देना नहीं है। इस कार्य को करने का इरादा नहीं है। बस निम्नलिखित कोड का उपयोग करें।

Dim str1 As String
str1=""
str1 ="3.4679" 
  Dim substring As String = str1.Substring(0, 3)

    ' Write the results to the screen.
    Console.WriteLine("Substring: {0}", substring)

Or 
    Please use the following code.
Public function result(ByVal x1 As Double) As String 
  Dim i as  Int32
  i=0
  Dim y as String
  y = ""
  For Each ch as Char In x1.ToString
    If i>3 then
     Exit For
    Else
    y + y +ch
    End if
    i=i+1
  Next
  return y
End Function

उपरोक्त कोड को किसी भी संख्या के लिए संशोधित किया जा सकता है। निम्नलिखित कोड को एक बटन क्लिक घटना में डालें

Dim str As String 
str= result(3.4679)
 MsgBox("The number is " & str)

-2

किस बारे में

var i = Math.Truncate(number);var r = i + Math.Truncate((number - i) * 100) / 100;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.