দশমিক বিন্দুর পরে সংখ্যাটির সন্ধানের জন্য সেরা সমাধানগুলির একটি বার্ন_এলজিওনের পোস্টে প্রদর্শিত হয় ।
এখানে আমি একটি এসটিএসডিবি ফোরামের নিবন্ধ থেকে অংশগুলি ব্যবহার করছি: দশমিক পয়েন্টের পরে অঙ্কের সংখ্যা ।
এমএসডিএন-তে আমরা নিম্নলিখিত ব্যাখ্যাটি পড়তে পারি:
"দশমিক সংখ্যা হ'ল একটি ভাসমান-বিন্দু মান যা একটি চিহ্ন, একটি সংখ্যাসূচক মান নিয়ে গঠিত যেখানে মানের প্রতিটি অঙ্ক 0 থেকে 9 এর মধ্যে হয় এবং একটি স্কেলিং ফ্যাক্টর যা ভাসমান দশমিক বিন্দুর অবস্থান নির্দেশ করে যা অবিচ্ছেদ্য এবং ভগ্নাংশকে পৃথক করে সংখ্যার মান অংশ। "
এবং আরো:
"দশমিক মানটির বাইনারি উপস্থাপনায় 1-বিট চিহ্ন, একটি 96-বিট পূর্ণসংখ্যার সংখ্যা এবং 96-বিট পূর্ণসংখ্যা বিভক্ত করতে ব্যবহৃত একটি স্কেলিং ফ্যাক্টর থাকে এবং এর কোন অংশটি দশমিক ভগ্নাংশ নির্দিষ্ট করে। স্কেলিং ফ্যাক্টরটি স্পষ্টতই 10 নম্বর, 0 থেকে 28 এর মধ্যে একটি বেদীকে উত্থাপিত হয়েছিল ""
অভ্যন্তরীণ স্তরে দশমিক মান চারটি পূর্ণসংখ্যার মান দ্বারা প্রতিনিধিত্ব করা হয়।
অভ্যন্তরীণ উপস্থাপনা পাওয়ার জন্য এখানে সর্বজনীনভাবে উপলব্ধ গেটবিটস ফাংশন রয়েছে। ফাংশনটি একটি int [] অ্যারে প্রদান করে:
[__DynamicallyInvokable]
public static int[] GetBits(decimal d)
{
return new int[] { d.lo, d.mid, d.hi, d.flags };
}
ফিরে আসা অ্যারের চতুর্থ উপাদানটিতে একটি স্কেল ফ্যাক্টর এবং একটি চিহ্ন রয়েছে। এবং এমএসডিএন যেমন বলেছে যে স্কেলিং ফ্যাক্টরটি স্পষ্টতই 10 নম্বর, এটি 0 থেকে 28 এর মধ্যে একটি ঘাতকের কাছে উত্থাপিত। এটি আমাদের প্রয়োজন ঠিক এটি।
সুতরাং, উপরোক্ত সমস্ত তদন্তের ভিত্তিতে আমরা আমাদের পদ্ধতিটি তৈরি করতে পারি:
private const int SIGN_MASK = ~Int32.MinValue;
public static int GetDigits4(decimal value)
{
return (Decimal.GetBits(value)[3] & SIGN_MASK) >> 16;
}
এখানে চিহ্নটি উপেক্ষা করার জন্য একটি SIGN_MASK ব্যবহৃত হয়। যৌক্তিকতার পরে এবং আমরা 16 বিট দিয়ে ফলাফলটিকে প্রকৃত স্কেল ফ্যাক্টরটি ডানদিকে সরিয়ে নিয়েছি। এই মানটি শেষ পর্যন্ত দশমিক বিন্দুর পরে অঙ্কের সংখ্যা নির্দেশ করে।
নোট করুন যে এখানে এমএসডিএন আরও বলেছে যে স্কেলিং ফ্যাক্টরটি কোনও দশমিক সংখ্যায় কোনও পিছনে জিরো সংরক্ষণ করে। ট্রেলিং জিরোগুলি পাটিগণিত বা তুলনামূলক ক্রিয়ায় দশমিক সংখ্যার মানকে প্রভাবিত করে না। তবে, যথাযথ বিন্যাসের স্ট্রিং প্রয়োগ করা হলে ট্যাস্ট্রিং পদ্ধতি দ্বারা অনুসরণযোগ্য জিরোগুলি প্রকাশিত হতে পারে।
এই সমাধানগুলি সেরাটির মতো দেখায় তবে অপেক্ষা করুন, আরও রয়েছে। দ্বারা C # এর ব্যক্তিগত পদ্ধতি অ্যাক্সেস আমরা পতাকা ক্ষেত্রের একটি সরাসরি প্রবেশাধিকার নির্মাণ ও int- এ অ্যারে নির্মাণের এড়াতে এক্সপ্রেশন ব্যবহার করতে পারেন:
public delegate int GetDigitsDelegate(ref Decimal value);
public class DecimalHelper
{
public static readonly DecimalHelper Instance = new DecimalHelper();
public readonly GetDigitsDelegate GetDigits;
public readonly Expression<GetDigitsDelegate> GetDigitsLambda;
public DecimalHelper()
{
GetDigitsLambda = CreateGetDigitsMethod();
GetDigits = GetDigitsLambda.Compile();
}
private Expression<GetDigitsDelegate> CreateGetDigitsMethod()
{
var value = Expression.Parameter(typeof(Decimal).MakeByRefType(), "value");
var digits = Expression.RightShift(
Expression.And(Expression.Field(value, "flags"), Expression.Constant(~Int32.MinValue, typeof(int))),
Expression.Constant(16, typeof(int)));
return Expression.Lambda<GetDigitsDelegate>(digits, value);
}
}
এই সংকলিত কোডটি গেটডিজিটস ক্ষেত্রে বরাদ্দ করা হয়েছে। নোট করুন যে ফাংশনটি দশমিক মান রেফ হিসাবে গ্রহণ করে, তাই কোনও আসল অনুলিপি করা হয় না - কেবলমাত্র মানটির একটি উল্লেখ। ডেসিমেলহেল্পার থেকে গেটডিজিটস ফাংশনটি ব্যবহার করা সহজ:
decimal value = 3.14159m;
int digits = DecimalHelper.Instance.GetDigits(ref value);
দশমিক মানের জন্য দশমিক পয়েন্টের পরে সংখ্যা সংখ্যা পাওয়ার এটি দ্রুততম পদ্ধতি।