সি # তে অর্থের জন্য ব্যবহারের জন্য সেরা ডেটা টাইপ কী?


426

সি # তে অর্থের জন্য ব্যবহারের জন্য সেরা ডেটা টাইপ কী?


4
আপনি এই পোস্ট থেকে উত্তর সহায়ক হতে পারে ।
এনটিম্ববেলা

সমস্ত ডেটা প্রকারের জন্য এখানে একটি ম্যাপিং রয়েছে: ডকস.মাইক্রোসফট.ফেন
ডটনেট

এছাড়াও, যদি ডেটা টীকাগুলি ব্যবহার করে, অন্তর্ভুক্ত করুন using System.ComponentModel.DataAnnotations;... [DataType(DataType.Currency)] এমএসডিএন.মাইক্রোসফটকম
en

উত্তর:


422

এটি দশমিক হিসাবে বর্ণিত হিসাবে:

দশমিক কীওয়ার্ডটি 128-বিট ডেটা টাইপ নির্দেশ করে। ভাসমান-বিন্দুর ধরণের তুলনায় দশমিক ধরণের আরও সূক্ষ্মতা এবং একটি ছোট পরিসীমা রয়েছে, যা এটি আর্থিক এবং আর্থিক গণনার জন্য উপযুক্ত করে তোলে ।

আপনি নিম্নলিখিত হিসাবে একটি দশমিক ব্যবহার করতে পারেন:

decimal myMoney = 300.5m;

41
সেই লিঙ্কটি কী গুরুত্বপূর্ণ তা আপনার ব্যাখ্যা করা উচিত। অতিরিক্ত উত্তর বা বিশদ হিসাবে একটি লিঙ্ক সহ একটি উত্তর নিজের পক্ষে যথেষ্ট ভাল হওয়া উচিত। দেখুন stackoverflow.com/help/how-to-answer
TheRubberDuck

2
সুতরাং সর্বনিম্ন-দৈর্ঘ্যের উত্তরটি ন্যূনতম-দৈর্ঘ্যের মন্তব্যের চেয়ে কম অক্ষর হতে পারে - আকর্ষণীয়! সংক্ষিপ্ত / সংক্ষিপ্ত উত্তর নিয়ে আমার কোনও সমস্যা আছে তা নয়, বিশেষত যখন এটি "গভীর" হয় এটি আরও আলোচনার সাথে যুক্ত হয়।
বি ক্লে শ্যানন

3
আশ্চর্যজনক উত্তর, এবং আমার মনে হয় না যে এটির আরও ব্যাখ্যা দরকার কারণ এটি প্রশ্নের সম্পূর্ণ উত্তর দেয়। এমএসডিএন ডকুমেন্টেশনের লিঙ্কটি আমি যতটা উদ্বিগ্ন বোনাস। বলিহারি!
ট্রেনসন

@ লাই ট্র্যাভিল, অর্থটি কেমন (9.0098) অর্থ পয়েন্টের পরে 4 চরিত্র
এসএআর

114

System.Decimal

দশমিক মান ধরণের দশমিক সংখ্যাগুলি ধনাত্মক 79,228,162,514,264,337,593,543,950,335 থেকে negativeণাত্মক 79,228,162,514,264,337,593,543,950,335 পর্যন্ত প্রতিনিধিত্ব করে। দশমিক মান ধরণের আর্থিক গণনার জন্য উপযুক্ত যেগুলি বৃহত সংখ্যক উল্লেখযোগ্য ইন্টিগ্রাল এবং ভগ্নাংশের অঙ্কের প্রয়োজন এবং কোনও বৃত্তাকার বন্ধ ত্রুটি নেই। দশমিক প্রকারটি বৃত্তাকার জন্য প্রয়োজনীয়তা দূর করে না। বরং এটি গোল করার কারণে ত্রুটিগুলি হ্রাস করে।

কেন ডাবল ব্যবহার করা উচিত নয় তা জেনেজ করে আমি এই দুর্দান্ত উত্তরের দিকে ইঙ্গিত করতে চাই ।


68

এন্টারপ্রাইজ অ্যাপ্লিকেশন আর্কিটেকচারের ধরণগুলি থেকে অর্থের প্যাটার্ন ব্যবহার করুন ; দশমিক হিসাবে পরিমাণ এবং এনুম হিসাবে মুদ্রা নির্দিষ্ট করুন।


2
আমি আসলে এটি প্রস্তাব করতে যাচ্ছিলাম, তবে আমি মুদ্রাকে একটি শ্রেণি তৈরি করি যাতে আমি একটি বিনিময় হারকে সংজ্ঞায়িত করতে পারি (একটি "বেস মুদ্রার সাথে" প্রায়শই মার্কিন ডলার [যা আমি বিনিময় হারের সাথে 1.00 ডলার সেট করেছিলাম)।
টমাস

5
এই থ্রেডের ভবিষ্যতের দর্শকদের জন্য (আমার মতো) এখন এটি রয়েছে: nuget.org/packages/Money এবং এটি দুলছে !
কোরিজন

ভাবছেন যে এই জাতীয় ধরণটি স্ট্রাক্ট বা শ্রেণি হওয়া উচিত। একটি দশমিক + এন (অন্তর্) এনাম এটিকে 20 বাইট করে। আমার টাকা এখনও স্ট্র্যাটে আছে।
নওফাল

Moneyপ্রকল্পের সাইটের জন্য এই নুগেটের একটি ডেড গিথুব লিঙ্ক রয়েছে ... তাই কোনও ডক্স নেই?
জর্জ

এর সাথে সমস্যাটি হ'ল যদি আপনি নিজের প্রয়োগ বাস্তবায়ন তৈরি করেন তবে আপনাকে কীভাবে বাস্তবে এটি চালিয়ে যেতে হবে তা নির্ধারণ করতে হবে। এবং সর্বাধিক জনপ্রিয় ওআরএম (ইএফ) এর কাস্টম ডেটা ধরণের জন্য কোনও সমর্থন নেই। অতএব কেউ পেতে চেয়েছেন হয় সত্যিই আগাছা গভীর কি সুন্দর সহজবোধ্য জিনিস হওয়া উচিত না।
জর্জ মাউয়ার

25

ডেসিমাল। আপনি যদি দ্বিগুণ চয়ন করেন তবে আপনি নিজেকে গোলাকার ত্রুটির জন্য উন্মুক্ত রেখে চলেছেন


8
@ জেস doubleরাউন্ডিং ত্রুটিগুলি প্রবর্তন করতে পারে কারণ ভাসমান পয়েন্ট সমস্ত সংখ্যককে সঠিকভাবে উপস্থাপন করতে পারে না (উদাহরণস্বরূপ 0.01 ভাসমান পয়েন্টে কোনও সঠিক প্রতিনিধিত্ব নেই)। Decimalঅন্যদিকে, সংখ্যাগুলি হুবহু উপস্থাপন করে । (বাণিজ্য বন্ধটি ভাসমান পয়েন্টের তুলনায় একটি ছোট পরিসীমা রয়েছে) ভাসমান পয়েন্ট আপনাকে * অজানা * বৃত্তাকার ত্রুটিগুলি দিতে পারে (উদাঃ )। আপনাকে গোল করার ত্রুটি দিতে পারে, তবে কেবল যখন আপনি এটি চেয়েছিলেন (যেমন শূন্যটি ফেরত দেয়)Decimal0.01+0.01 != 0.02DecimalMath.Round(0.01+0.02)
ইয়ান বয়ড

2
@ আইয়ানবয়েড: "$ 1.57" মানটি 157 (ডাবল) যথাযথভাবে উপস্থাপিত হতে পারে। যদি কেউ doubleযথাযথভাবে স্কেলিং এবং ডোমেন-নির্দিষ্ট রাউন্ডিং ব্যবহার করে এবং সাবধানতার সাথে প্রয়োগ করে তবে এটি পুরোপুরি সুনির্দিষ্ট হতে পারে। যদি কারও রাউন্ডিংয়ে opিপি হয় তবে decimalফলাফলগুলি ফল দিতে পারে যা শব্দার্থগতভাবে ভুল (উদাহরণস্বরূপ যদি কেউ একসাথে একাধিক মান যোগ করে যা নিকটতম পয়সাতে গোল বলে মনে হয় তবে বাস্তবে প্রথমে তাদের চারপাশে হয় না)। কেবলমাত্র ভাল জিনিসটি decimalহল স্কেলিংটি অন্তর্নির্মিত।
সুপারক্যাট

1
@ সুপের্যাট, এই মন্তব্যের বিষয়ে "যদি কেউ একসাথে একাধিক মান যুক্ত করে যা নিকটতম পয়সা দিয়ে গোল করার কথা, তবে বাস্তবে প্রথমে তাদের চারপাশে না আসে", আমি দেখি না যে কোনও ফ্লোট কীভাবে এটি সমাধান করবে। এটি একটি ব্যবহারকারীর ত্রুটি এবং এর দশমিক IMHO এর সাথে কোনও সম্পর্ক নেই। আমি বিষয়টি বুঝতে পারি তবে আমার মনে হয় এটি ভুল জায়গায় প্রতিস্থাপন করা হয়েছে, মূলত কারণ ইয়ানবয়েড নির্দিষ্ট করে দিয়েছে ... আপনি যদি এটি জিজ্ঞাসা করেন।
sawe

16

দশমিকের একটি ছোট পরিসীমা রয়েছে, তবে আরও নির্ভুলতা রয়েছে - যাতে আপনি সময়ের সাথে সাথে এই সমস্ত পেনিস হারাবেন না!

এখানে সম্পূর্ণ বিবরণ:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx


13

অর্থের প্যাটার্নের সাথে একমত: যখন আপনি দশমিক ব্যবহার করেন তখন মুদ্রা পরিচালনা করা খুব জটিল umbers

আপনি যদি কোনও মুদ্রা-শ্রেণি তৈরি করেন, তবে আপনি সেখানে টস স্ট্রিং () - পদ্ধতি, পার্সিং মানগুলির আরও নিয়ন্ত্রণ এবং বিভাগের আরও ভাল নিয়ন্ত্রণ সহ অর্থের সাথে সম্পর্কিত সমস্ত যুক্তি রাখতে পারেন।

এছাড়াও, একটি কারেন্সি ক্লাসের সাথে অনিচ্ছাকৃতভাবে অন্যান্য ডেটার সাথে অর্থ মিশ্রণের কোনও সম্ভাবনা নেই।


10

আরেকটি বিকল্প (বিশেষত যদি আপনি নিজের শ্রেণীর মালিক হয়ে থাকেন) হ'ল কোনও আন্ত বা একটি ইন্টার 64৪ ব্যবহার করা এবং নিম্নোক্ত চারটি অঙ্ক (বা সম্ভবত এমনকি 2) "দশমিক পয়েন্টের ডান" হিসাবে মনোনীত করা। সুতরাং "কিনারায়" আপনার পথে কিছু "* 10000" এবং বেরোনোর ​​পথে কিছু "* 10000" দরকার। এটি মাইক্রোসফ্টের এসকিউএল সার্ভার দ্বারা ব্যবহৃত স্টোরেজ মেকানিজম, দেখুন http://msdn.microsoft.com/en-au/library/ms179882.aspx

এর বিশেষত্ব হল আপনার সমস্ত যোগফল (দ্রুত) পূর্ণসংখ্যার গাণিতিক ব্যবহার করে করা যেতে পারে।


7

বেশিরভাগ অ্যাপ্লিকেশন আমি decimalঅর্থ উপস্থাপনের জন্য ব্যবহার করে কাজ করেছি । এটি এই ধারণার উপর ভিত্তি করে তৈরি করা হয় যে অ্যাপ্লিকেশনটি একাধিক মুদ্রার সাথে কখনই উদ্বিগ্ন হবে না।

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

এখন এই অনুমানটি একটি নতুন উপায়ে চ্যালেঞ্জ করা হচ্ছে: বিটকয়েনের মতো নতুন মুদ্রাগুলি আরও সাধারণ হয়ে উঠছে, এবং সেগুলি কোনও দেশের ক্ষেত্রে সুনির্দিষ্ট নয়। এটি অবাস্তব নয় যে কেবলমাত্র একটি দেশে ব্যবহৃত একটি অ্যাপ্লিকেশনটির জন্য এখনও একাধিক মুদ্রাকে সমর্থন করার প্রয়োজন হতে পারে।

কিছু লোক বলবেন যে কেবল অর্থের জন্য কোনও প্রকার তৈরি করা বা ব্যবহার করা হ'ল "সোনার প্রলেপ দেওয়া" বা জানা প্রয়োজনীয়তার বাইরে অতিরিক্ত জটিলতা যুক্ত করা। আমি দৃ strongly়ভাবে একমত না। আপনার ডোমেনের মধ্যে একটি ধারণা যত বেশি সর্বব্যাপী, তত বেশি গুরুত্বপূর্ণ সঠিক বিমূর্ততাটি সামনে রেখে ব্যবহার করার জন্য যুক্তিসঙ্গত প্রচেষ্টা করা। আপনি যদি জটিলতা দেখতে চান তবে এমন একটি অ্যাপ্লিকেশনটিতে কাজ করার চেষ্টা করুন যা ব্যবহার করা হত decimalএবং এখন Currencyপ্রত্যেকের পাশে একটি অতিরিক্ত সম্পত্তি রয়েছেdecimal সম্পত্তির সম্পত্তি রয়েছে।

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

এবং দশমিক ব্যতীত অন্য কিছু ব্যবহার করা এতটা কঠিন নয়। গুগল "নুগেট টাকার প্রকার" এবং আপনি দেখতে পাবেন যে অসংখ্য বিকাশকারী এ জাতীয় বিমূর্ততা তৈরি করেছেন (আমাকে সহ) এটি সহজ। এটি DateTimeএকটিতে তারিখ সংরক্ষণের পরিবর্তে ব্যবহার করার মতোই সহজ string


5

আপনার নিজস্ব ক্লাস তৈরি করুন। এটি অদ্ভুত বলে মনে হচ্ছে, তবে একটি। নেট টাইপ বিভিন্ন মুদ্রা কভার করার জন্য অপর্যাপ্ত।

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