গোল না করে দুটি দশমিক স্থান ছাঁটাই করুন


113

আসুন বলি যে আমার মান 3.4679 আছে এবং 3.46 চাই, আমি কীভাবে দুটি দশমিক জায়গায় কাটাতে পারি যে গোল না করে?

আমি নিম্নলিখিতটি চেষ্টা করেছি তবে তিনটিই আমাকে ৩.4747 দিয়েছে:

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

এটি ৩.4646 ফিরিয়ে দেয় তবে কিছুটা নোংরা মনে হয় কীভাবে:

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

উত্তর:


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

সাবধান থাকবেন যে এর মতো ভগ্নাংশগুলি ভাসমান স্থলে সঠিকভাবে উপস্থাপন করা যায় না।


13
আপনার মানগুলির জন্য দশমিক ব্যবহার করুন এবং এই উত্তরটি কার্যকর হবে। কোনও ভাসমান পয়েন্ট উপস্থাপনে সর্বদা কাজ করার সম্ভাবনা নেই।
ড্রিস

4
এটি আমাকে বিস্মিত করে তোলে যে ভাসমান পয়েন্ট লিটারালগুলিতে বৃত্তাকার দিক নির্দিষ্ট করা সম্ভব কিনা whether হুমমমম।
স্টিভ 314

সেখানে হতে হয়েছে কিছু উপায় প্রোগ্রামার বলতে ধৃষ্টতা যা নম্বর বেশি 308 টি সংখ্যা সংরক্ষণ করতে পারেন সঙ্গে গণক হয় একেবারেই অনুপযুক্ত। ডাবল কেবল 15 টি সঞ্চয় করতে পারে Over এখানে ওভারফ্লো খুব বেশি বৈশিষ্ট্যযুক্ত, এটি বরং খারাপভাবে উপচে পড়েছে।
হান্স প্যাস্যান্ট

আমি দুঃখিত, আমি ভেবেছিলাম "মান" দশমিক।
নাইটকোডার

54

সি # তে দশমিকের কাটা রিয়েল-ওয়ার্ল্ড ব্যবহারের জন্য একটি সম্পূর্ণ ফাংশন ব্যবহার করা আরও কার্যকর হবে। আপনি চাইলে এটি দশমিক এক্সটেনশন পদ্ধতিতে রূপান্তরিত হতে পারে:

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

আপনার যদি ভিবি.এনইটি প্রয়োজন হয় তবে এটি ব্যবহার করে দেখুন:

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)

4
এটি প্রচুর সংখ্যায় উপচে পড়বে।
নাইটকোডার

4
নাইট কোডার যুক্ত করতে, আপনি আপনার ফাংশনে মধ্যবর্তী হিসাবে ইন্ট 32 ব্যবহার করছেন তা সত্যই প্রবাহিত হবে। আপনার যদি সত্যই এটি একটি পূর্ণসংখ্যার জন্য কাস্ট করা আবশ্যক তবে আপনার ইন্টার 64 ব্যবহার করা উচিত। ট্রানসেট যেভাবেই ডেসিমাল ইন্টিগ্রালগুলি প্রদান করে যেহেতু আপনি কেন এই অতিরিক্ত ওভারহেড লাগাতে চান তা প্রশ্ন The ঠিক এর মতো কিছু করুন: দশমিক পদক্ষেপ = (দশমিক) ম্যাথ.প্যাও (10, নির্ভুলতা); রিটার্ন ম্যাথ। ট্রান্সকেট (পদক্ষেপ * মান) / পদক্ষেপ;
সেরেল এস্টারহুইজন

আমি castালাই পূর্ণসংখ্যায় ফেলেছি। ফাংশনটি কীভাবে কাজ করে তা বোঝার জন্য আমি তাদের পৃথক রেখা রেখেছি।
করগালোর

30

মডুলাস অপারেটরটি ব্যবহার করুন:

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

ফলাফল: 0.54


4
আমি বুঝতে পারি না (পড়ুন: যাচাই করার জন্য সময় ব্যয় করলেন না) এই সমস্ত অভিনব সমাধানগুলি, আমি যা খুঁজছিলাম ঠিক এটি এটি করে । ধন্যবাদ!
আইজাক বাকের

এটি চালিয়ে যাওয়া। নেট ফিডল ক্লিকিক উত্পাদন করে 0.5400... নীচে ডি নেস্টারভের উত্তর প্রত্যাশিত উত্পাদন করেছিল 0.54
ttugates

আপনি বুঝতে পারবেন, @ ট্যাগস, যে 0.54 এবং 0.5400 ঠিক একই মান, তাই না? প্রদর্শনের জন্য ফর্ম্যাট করার সময় না আসা পর্যন্ত কতগুলি জিরো অনুসরণ করে তা বিবেচ্য নয় which যে ক্ষেত্রে, সঠিকভাবে ফর্ম্যাট করলে ফলাফল একই হবে: $"{0.54m:C}"উত্পাদন "$0.54"এবং হ্যাঁ, $"{0.5400m:C}"উত্পাদন করে "$0.54"
লিওনার্ড লুইস

29

এর জন্য সর্বজনীন এবং দ্রুত পদ্ধতি ( 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;
}

5
অন্যান্য উত্তরে উল্লিখিত সমস্ত পরীক্ষার মধ্যে দিয়ে আমি এটি চালিয়েছি এবং এটি পুরোপুরি কার্যকর হয়। আশ্চর্যরকম এটির আরও বেশি কিছু নেই doesn't এটি লক্ষণীয় যে দশমিকগুলি কেবল 0 থেকে 28 এর মধ্যে হতে পারে (সম্ভবত বেশিরভাগ লোকের পক্ষে ঠিক আছে)।
রিচার্ডড

4
আমি দ্বিতীয় যে. এটি সেরা উত্তর। +1
ব্র্যাঙ্কো দিমিত্রিজেভিক

4
দুর্দান্ত উত্তর,
এটাকেই

ভাল উত্তর. এটি ডাবল ডেটা টাইপের সাথেও কাজ করে, আমি যদি "নতুন দশমিক (1, 0, 0, মিথ্যা, দশমিক)";) এর মূল্য হার্ড কোড করতে সক্ষম হই
মোহন

24

অন্যান্য উদাহরণগুলির সাথে একটি সমস্যা হ'ল তারা ভাগ করার আগে ইনপুট মানকে গুণ করে । এখানে একটি প্রান্তের কেস রয়েছে যা আপনি দশমিকের ওভারফ্লো করতে পারেন, প্রথমে একটি কিনার কেস, তবে কিছু আমি পেরিয়ে এসেছি। ভগ্নাংশের অংশটি আলাদাভাবে মোকাবেলা করা আরও নিরাপদ:

    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) এটি পরিণতিতে যথাযথ ত্রুটি ঘটবে। আমি এটি ফ্যাক্টর ধরণের দশমিক পরিবর্তন করে ঠিক করেছি।
থিংক্যাডেভ

@ দ্য কেইকিং ডেভ: সম্ভবত এটি অপ্রাসঙ্গিক তবে কারণ হিসাবে দশমিকটি না হতে পারে এটি দীর্ঘস্থায়ী হিসাবে মডেল করা ভাল হওয়া উচিত?
ইগনাসিও সোলার গার্সিয়া

@ সোমোস আমার জন্য ডেসিমাল আরও ভাল কাজ করেছেন কারণ এটি আমাকে ফ্যাক্টরের জন্য সর্বোচ্চ স্টোরেজ মান দিয়েছে। এটির এখনও একটি সীমাবদ্ধতা রয়েছে তবে এটি আমার আবেদনের পক্ষে যথেষ্ট বড়। অন্যদিকে দীর্ঘ আমার অ্যাপ্লিকেশনটির জন্য যথেষ্ট পরিমাণে যথেষ্ট পরিমাণে সঞ্চয় করতে সক্ষম ছিল না। উদাহরণস্বরূপ, আপনি যদি দীর্ঘকাল ধরে একটি ছাঁটাই করেন (25) তবে কিছুটা ভুল হবে।
থিংকডেভ

@ থিংক্যাডের পরামর্শ অনুসারে বৃহত্তর সংখ্যক জায়গায় কাটা কাটাতে অনুমতি দেওয়ার জন্য আপডেট করা হয়েছে, ধন্যবাদ।
টিম লয়েড

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

4
আমি এর সাথে "প্রাক্তন" প্রত্যয় পছন্দ করি না। সি # ওভারলোডিং সমর্থন করে, আপনার Truncateপদ্ধতিটি নেট নেট দ্বারা একসাথে গ্রেফতার করা হবে, ব্যবহারকারীকে একবিরাম অভিজ্ঞতা দেবে giving
Gqqnbig

4
আপনার অ্যালগরিদমের ফলাফল কিছু ভুল ফলাফল। ডিফল্ট মিডপয়েন্ট রাউন্ডিং মোডটি ব্যাঙ্কারের রাউন্ডিং, এটি সর্বনিম্ন সমমানের মান থেকে 0.5 কে গোল করে। Assert.AreEqual(1.1m, 1.12m.TruncateEx(1));এই কারণে ব্যর্থ। আপনি যদি ম্যাথটিতে "সাধারণ" রাউন্ডিং (অ্যাওফ্রোমজিরো) নির্দিষ্ট করেন ound রাউন্ড কল, তারপরে Assert.AreEqual(0m, 0m.TruncateEx(1));ব্যর্থ হয়
জন সেনচেনা

4
এই সমাধানটি কেবলমাত্র কার্যকর হবে যদি আপনি MidpointRounding.AwayFromZeroমান 0 ব্যবহার করতে কোড এবং বিশেষত কোড ব্যবহার করেন তবে
জন সেনচিনা

4
জন সঠিক: 0 মি। ট্রান্সকাটেক্স (0) এর ফলাফল -1-এ ফলাফল প্রকাশিত হয় যদি না 0 স্পষ্টভাবে পরিচালনা করা হয়। একইভাবে -11 মি। ট্রাঙ্কেটেক্স (0) এর ফলাফল -10 এর মধ্যে মিডপয়েন্ট রাউন্ডিং না করে Aআউএফ্রোমজিরো ম্যাথ.রউন্ডের মধ্যে ব্যবহৃত হয়। যদিও এই পরিবর্তনগুলির সাথে ভালভাবে কাজ করছে বলে মনে হচ্ছে।
হো হো হো

4
এমনকি অ্যাওফ্রোমজিরোর পরিবর্তন এবং 0, -999999999999999999999999999999999999m.TruncateEx (0) এর ফলাফল -৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৯৮-এর ফলাফল রয়েছে, সুতরাং এটি কিছু ক্ষেত্রে এখনও পতনীয়।
হো হো হো

3

এটি একটি পুরানো প্রশ্ন, তবে অনেক আনোসার খুব ভাল সংখ্যার জন্য ভাল সঞ্চালন বা ওভারফ্লো করে না। আমি মনে করি ডি নেস্টারভ উত্তরটি সবচেয়ে ভাল: শক্ত, সহজ এবং দ্রুত। আমি কেবল আমার দুটি সেন্ট যুক্ত করতে চাই। আমি দশমিকের সাথে প্রায় খেলেছি এবং উত্স কোডটিও দেখেছি । থেকে public Decimal (int lo, int mid, int hi, bool isNegative, byte scale) কন্সট্রাকটর ডকুমেন্টেশন

দশমিক সংখ্যার বাইনারি উপস্থাপনায় একটি 1-বিট চিহ্ন, একটি 96-বিট পূর্ণসংখ্যার সংখ্যা এবং একটি পূর্ণমান সংখ্যাটি ভাগ করতে ব্যবহৃত স্কেলিং ফ্যাক্টর এবং এর অংশটি দশমিক ভগ্নাংশ নির্দিষ্ট করে। স্কেলিং ফ্যাক্টরটি সুস্পষ্টভাবে 0 থেকে 28 এর মধ্যে কোনও এক্সপোনেন্টকে উত্থাপিত 10 নম্বর।

এটি জানতে পেরে আমার প্রথম পদ্ধতির মধ্যে অন্যটি তৈরি করা হয়েছিল 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এবং বিট দু'বার পুনরুদ্ধার করা এটি ধীর করে দিচ্ছে। আমার দ্বিতীয় প্রচেষ্টায়, আমি নিজেই ডেসিমাল.গেটবিটস (দশমিক d) পদ্ধতি দ্বারা ফিরে আসা উপাদানগুলিকে চালিত করেছিলাম। ধারণাটি হ'ল উপাদানগুলি প্রয়োজন হিসাবে 10 বার হিসাবে বিভক্ত করা এবং স্কেল হ্রাস করা। কোডটি দশমিকের উপর ভিত্তি করে (ভারীভাবে) ইনটার্নালআউন্ডআউন্ড্রোমজিরো (রেফ ডেসিমাল ডি, ইন্টি ডেসিমাল কাউন্ট) পদ্ধতিতে

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

আমি কঠোর পারফরম্যান্স পরীক্ষা করিনি, তবে একটি ম্যাকওএস সিয়েরা 10.12.6, 3,06 গিগাহার্টজ ইন্টেল কোর আই 3 প্রসেসর এবং লক্ষ্যবস্তুতে। নেটকোর 2.1 এই পদ্ধতিটি ডি নেস্টারভের চেয়ে অনেক দ্রুত বলে মনে হচ্ছে (যেহেতু আমি সংখ্যা দেব না) , যেমনটি আমি বলেছি, আমার পরীক্ষাগুলি কঠোর নয়)। পারফরম্যান্স লাভ কোড যুক্ত জটিলতার জন্য প্রদান করে কি না তা মূল্যায়নের জন্য যে কেউ এটি প্রয়োগ করে এটি নির্ভর করে।


সমস্ত চিন্তাভাবনা এবং প্রচেষ্টার কারণে আমাকে উজ্জীবিত হতে হয়েছিল। আপনি নেস্টারভের একটি মানদণ্ড হিসাবে সেট করেছেন এবং চালিয়ে যাচ্ছেন - টুপি বন্ধ।
অ্যান্ড্রুবেনজামিন



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
আসলে, হার্ডকোডিং '।' ভাল ধারণা নয়, আরও ভাল ব্যবহার করুন সিস্টেম.গ্লোবালাইজেশন.কুলচারআইফোন.কন্টেনক্রালচার.নাম্বার ফর্ম্যাট।নম্বার ডেসিমেলসপেটেরেটর [0]
ডেভিড আইরাপেটিয়ান

0

এখানে আমার টিআরএনসি ফাংশনের বাস্তবায়ন

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.009999999999999999999999999999M এর দশমিক মান ছিল যা | সাবসেন্ট: 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;
        }
    }

4
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
নিক 3500

0

আমি এটিই করেছি:

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

দশমিকের বৃত্তাকার বা নিচে গোল না করে দুটি ইনপুটযুক্ত সংখ্যা বিয়োগ করা। কারণ অন্যান্য সমাধানগুলি আমার পক্ষে কাজ করে না। এটি অন্যের পক্ষে কাজ করবে কিনা জানি না, আমি কেবল এটি ভাগ করে নিতে চাই :) আশা করি এটি আমার জন্য অনুরূপ সমস্যার সমাধান খুঁজছেন তাদের জন্য কাজ করে। ধন্যবাদ

পিএস: আমি একজন শিক্ষানবিস তাই এ সম্পর্কে কিছু জানাতে নির্দ্বিধায়। : ডি এটি ভাল যদি আপনি আসলে অর্থের মোকাবেলা করছেন, কেন সেন্টের কারণ? এটিতে কেবলমাত্র 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);


-2

আসলে আপনি 3.4679 থেকে 3.46 চান। এটি কেবল অক্ষরের প্রতিনিধিত্ব। সুতরাং গণিত ফাংশনটির সাথে কিছুই করার নেই ath ম্যাথ ফাংশনটি এই কাজটি করার উদ্দেশ্যে নয়। কেবল নিম্নলিখিত কোডটি ব্যবহার করুন।

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)

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