কেন নেট নেট ব্যাঙ্কারের গোলকে ডিফল্ট হিসাবে ব্যবহার করে?


271

ডকুমেন্টেশন অনুসারে, decimal.Roundপদ্ধতিটি একটি বৃত্তাকার থেকে সম-অ্যালগরিদম ব্যবহার করে যা বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য সাধারণ নয়। তাই আরও বেশি প্রাকৃতিক রাউন্ড হাফ-আপ অ্যালগরিদম করার জন্য আমি সবসময় একটি কাস্টম ফাংশন লিখে শেষ করি:

public static decimal RoundHalfUp(this decimal d, int decimals)
{
    if (decimals < 0)
    {
        throw new ArgumentException("The decimals must be non-negative", 
            "decimals");
    }

    decimal multiplier = (decimal)Math.Pow(10, decimals);
    decimal number = d * multiplier;

    if (decimal.Truncate(number) < number)
    {
        number += 0.5m;
    }
    return decimal.Round(number) / multiplier;
}

এই কাঠামো ডিজাইনের সিদ্ধান্তের পিছনে কারণ কি কেউ জানেন?

রাউন্ড হাফ-আপ অ্যালগরিদমের কাঠামোর মধ্যে কোনও অন্তর্নির্মিত প্রয়োগ আছে? অথবা হয়ত কিছু ব্যবস্থাপনিত উইন্ডোজ এপিআই?

এটি শুরুর জন্য বিভ্রান্তিকর হতে পারে যা কেবল decimal.Round(2.5m, 0)ফলস্বরূপ 3 প্রত্যাশার সাথে লিখলে পরিবর্তে 2 পেয়ে যায়।


105
গোল করা "আরও প্রাকৃতিক" নয় " প্রকৃতির এর সাথে কিছু করার নেই। আপনি যখন "রাউন্ডিং" ধারণাটি শিখেছিলেন তখন গ্রেডস্কুলে আপনি যা শিখেছিলেন তা কেবল এটি গ্রেডস্কুল পাঠ সর্বদা একটি সম্পূর্ণ ছবি আঁকেন না।
রব কেনেডি

45
@ রব এবং সে কারণেই এটি আরও প্রাকৃতিক , যদিও এটি সঠিক
প্যাসেরিয়র

10
আমি বুঝতে পারছি না, @ পেসারিয়র। আমি ব্যাখ্যা কেন এটা না প্রাকৃতিক, আর তোমরা বল কেন এটা যে আসলে এর হয় প্রাকৃতিক। আমার যুক্তিটি আমার উপসংহারের বিরুদ্ধে কীভাবে কাজ করবে যা আপনার বিপরীতে? আপনি যে জিনিসগুলিতে অভ্যস্ত হয়ে উঠছেন সেগুলি প্রাকৃতিক বোধ করতে পারে এবং কখনও কখনও আমরা আলংকারিকভাবে বলে থাকি যে কিছু "দ্বিতীয় প্রকৃতি" তবে এটি প্রাকৃতিক করে তোলে না।
রব কেনেডি

16
@ রব আমি বলছি এটি প্রাকৃতিক, কারণ এটি প্রাকৃতিক বোধ করে। আপনি কি জানেন যে একই ভেরিয়েবল নামের প্রাকৃতিক অধিকার সহ 36 টি পৃথক অবজেক্ট রয়েছে ?
পেসারিয়ার

9
প্রকৃতির স্পষ্টতই অ্যানালগ তাই এটি ব্যবহার করার জন্য ভুল শব্দ; তবে এটি পেডেন্টিক হচ্ছে। সম্ভবত 'স্বাভাবিক' ব্যবহারের জন্য আরও ভাল শব্দ হতে পারে .. "লোকেরা সাধারণত যে
গোলটি করেন

উত্তর:


196

সম্ভবত কারণ এটি একটি ভাল অ্যালগরিদম। সম্পাদিত অনেকগুলি রাউন্ডিংয়ের সময়কালে, আপনি গড় গড়ে পাবেন যে সমস্ত .5 এর সমাপ্তি সমানভাবে উপরে এবং নীচে হয়। এটি উদাহরণস্বরূপ যদি হয় তবে প্রকৃত ফলাফলগুলির আরও ভাল অনুমান দেয়, আমি বলব যে যদিও এটি কিছু প্রত্যাশা করে না তবে এটি সম্ভবত আরও সঠিক জিনিস।


71
ধরে নিচ্ছি আপনার কাছে অবশ্যই বিজোড় এবং এমনকি ইনপুটগুলির ফ্ল্যাট বিতরণ রয়েছে
জে কে।

7
জন্য +1 ভাল অ্যালগোরিদম , যদিও Ostemar হয়েছে প্রকৃত উত্তর ( stackoverflow.com/questions/311696/... )
ইয়ান বয়েড

2
@ ইয়ান, আমি উত্তরটিও +1 করি। যাইহোক আমরা "স্বীকৃত উত্তর স্থানান্তরিত" পেতে পারি সম্ভবত ওপি এটি করতে পারে। "কেন" এটি এই পদ্ধতিটি ব্যবহার করে তার আসল উত্তরটি পৃষ্ঠার অর্ধেক পথের নিচে। যদিও আমি এই উত্তরটি থেকে সপ্তাহে প্রায় এক বার পেয়েছি রেপ বুস্টটি বেশ পছন্দ করি।
কিব্বি

@ কিব্বি - আমার উত্তরটি এগিয়ে দেওয়ার জন্য ধন্যবাদ আমি অনুমান করি যে এটি উপযুক্ত দেখায় গ্রহণযোগ্য উত্তরটি পরিবর্তন করা ওপি-র কাজ?
ওস্তেমার

-1 উল্লেখ করার জন্য এটি আরও ভাল অ্যালগরিদম। - ব্যাঙ্কারের গোলাকৃতি ব্যবহার করে সংখ্যার একটি এলোমেলো নমুনা দেওয়া আপনার বিজোড় অবস্থানের চেয়েও সমান পজিশনে বেশি নম্বর থাকবে। - এই সংখ্যাগুলি গড় করার পরে কেবল আপনি মূল বিতরণে আবার একই রকম স্প্রেড পাবেন। - তবে আপনি যদি উদাহরণস্বরূপ কোনও স্ক্যাটার প্লটে এই ডেটা প্লট করেন তবে কেউ কৃত্রিম গ্রুপিং দেখতে পাবে।
পল 23

437

ব্যাঙ্কারের অ্যালগরিদম (ওরফে অর্ধ থেকে সমান রাস্তা ) ভাল পছন্দ হওয়ায় অন্যান্য উত্তরগুলি বেশ সঠিক। এটি বেশিরভাগ যুক্তিসঙ্গত বিতরণে শূন্য পদ্ধতি থেকে অর্ধেক দূরে যতটা নেতিবাচক বা ধনাত্মক পক্ষপাত হয় না ।

তবে প্রশ্নটি ছিল কেন। নেট নেট ব্যাঙ্কারের প্রকৃত গোলকে ডিফল্ট হিসাবে ব্যবহার করে - এবং উত্তরটি হ'ল মাইক্রোসফ্ট আইইইই 754 মান অনুসরণ করেছে । এটাও উল্লেখ করা হয় Math.Round জন্য দুটিই MSDN মন্তব্য করেন।

এছাড়াও নোট .NET MidpointRoundingগণনা সরবরাহ করে আইইইই দ্বারা নির্দিষ্ট বিকল্প পদ্ধতি সমর্থন করে । তারা অবশ্যই সম্পর্কগুলি সমাধানের আরও বিকল্প সরবরাহ করতে পারত , তবে তারা কেবল আইইইই মান পূরণ করতে পছন্দ করে।


17
সুতরাং, কেন আইইইই 754 ব্যাঙ্কারদের রাউন্ডিং অনুসরণ করবে? এই (এখনও ভাল) উত্তরটি কেবল বালতিটি কেটে যায়।
হেন্ক হলটারম্যান

4
@ হেনকহোল্টারম্যান সম্ভবত অন্যান্য উত্তরে বর্ণিত যা কারণে সম্ভবত (এবং আমি সংক্ষেপে বলেছি); এটি নেতিবাচক বা ধনাত্মক পক্ষপাত থেকে খুব বেশি ক্ষতিগ্রস্থ হয় না (যেমন) বেশিরভাগ বিতরণ এবং সমস্যাযুক্ত ডোমেনগুলির জন্য এটি আরও অনুরোধযোগ্য ডিফল্ট তৈরি করে।
ওস্তেমার


আমি মনে করি এটি আকর্ষণীয় কারণ আইআইইই 754 হল ভাসমান পয়েন্ট সংখ্যার মান যার মধ্যে দশমিক নয়। সম্ভবত এটি আইইইই 754 অনুসরণ করে যাতে ডেসিমাল হিসাবে ডাবলকে গোল করার জন্য একই অ্যালগরিদম ব্যবহৃত হয়।
ব্র্যান্ডন বার্কলে

1
@BrandonBarkley একটি ডেসিমাল বা দশমিক হয় একটি ফ্লোটিং পয়েন্ট সংখ্যা, এবং আইইইই 754 অন্তর্ভুক্ত করে দশমিক ফ্লোটিং পয়েন্ট নম্বর।
পাবলো এইচ

88

যদিও "মাইক্রোসফ্টের ডিজাইনাররা এটি ডিফল্ট হিসাবে কেন বেছে নিয়েছিল?" এই প্রশ্নের উত্তর দিতে পারি না, তবে আমি কেবল এটিই উল্লেখ করতে চাই যে একটি অতিরিক্ত ফাংশন অপ্রয়োজনীয়।

Math.Roundআপনাকে একটি নির্দিষ্ট করতে দেয় MidpointRounding:

  • টোভেন - যখন সংখ্যাটি অন্য দু'জনের মধ্যে অর্ধেক হয়ে যায়, তখন এটি নিকটতম সমান সংখ্যার দিকে বৃত্তাকার হয়।
  • অ্যাওফ্রোমজিরো - যখন কোনও সংখ্যা দু'জনের মধ্যে অর্ধেক হয়ে যায়, তখন এটি শূন্য থেকে দূরে থাকা নিকটতম সংখ্যার দিকে বৃত্তাকার হয়।

8
এবং আমি সম্পর্কিত থ্রেডগুলিতে যেমন উল্লেখ করেছি, নিশ্চিত হয়ে নিন যে আপনি আপনার বৃত্তাকারে সামঞ্জস্য বজায় রেখেছেন - আপনি যদি কখনও কখনও ডাটাবেসে গোল করেন, এবং কখনও কখনও নেটও হন তবে আপনার অদ্ভুত, এক শতাংশ ত্রুটি হবে যা আপনাকে সপ্তাহে সময় নিতে পারে খুঁজে বের করা।
ক্রিস

59
এক ক্লায়েন্ট একবার আমাকে দুটি বিলিয়ন ডলার লজ্জাজনক দুটি সংখ্যার মধ্যে $ 0.11 গোলাকার ত্রুটিটি সন্ধান করতে একবার আমাকে $ 40,000 ডলার দিয়েছিল; main 0.11 একটি মেইনফ্রেম এবং এসকিউএল সার্ভারের মধ্যে 8 তম অঙ্কের ত্রুটিযুক্ত ত্রুটির কারণে হয়েছিল was একজন পারফেকশনিস্ট সম্পর্কে কথা বলুন!
ইজে ব্রেন্নান

12
@ ইজেবি - আমি যদি এক বিলিয়ন ডলারের সাথে
লভ্যা করছিলাম

12
@ ইজে ব্রেণান: এটি নির্ধারণ করতে আপনার 40k ডলার লাগবে? আমি সর্বদা এর মতো সমস্যা দেখতে পাই, রাউন্ডিং কারণ # 1, ডাবল / ফ্লোট নরমালাইজেশন কারণ # 2, প্রোগ্রামার ত্রুটি # 3 - # 3 যদি পূর্বনির্ধারিত পরীক্ষার কেস না থাকে তবে অবিলম্বে # 1 এ সেট করা যেতে পারে। বিটিডব্লু আপনি দয়া করে আমাকে আপনার বিলিয়নের ক্লায়েন্টের সাথে যোগাযোগ করতে পারেন, আমি মনে করি তার সিস্টেমে আমি আরও কয়েকটি 40 ডলার বাগ খুঁজে পেতে পারি! : ডি

3
@ সানেক্সি: অথবা আপনি যদি অফিস স্পেস দেখতে পেতেন। সিরিয়াসলি, যখনই আপনি অর্থের মধ্যে রহস্যময়, ক্ষুদ্র ভুলগুলি দেখেন, ঠিক কীভাবে ঘটছে তার রহস্য সমাধান করা প্রায়শই একটি ভাল ধারণা। এটি সম্ভব যে আপনি বাগগুলি ঠিক না করার সিদ্ধান্ত নেবেন, তবে অন্তর্নিহিত কারণটি জানার এখনও মূল্য রয়েছে। আমি বাজি ধরে অনেক লোক যারা অর্থ নিয়ে কাজ করেন তারা এমনকি ক্ষুদ্রতর ভুল সম্পর্কেও খুশি হন।
ব্রায়ান

22

দশমিকগুলি বেশিরভাগ অর্থের জন্য ব্যবহৃত হয় ; অর্থ নিয়ে কাজ করার সময় ব্যাংকারদের রাউন্ডিং সাধারণ । অথবা আপনি বলতে পারেন।

এটি বেশিরভাগ ব্যাঙ্কার যাদের দশমিক ধরণের প্রয়োজন; সুতরাং এটি "ব্যাংকারদের বৃত্তাকার" করে

ব্যাংকারদের রাউন্ডিংয়ের সুবিধা রয়েছে যে আপনি যদি গড়ে: আপনি একই ফল পাবেন তবে আপনি:

  • সেগুলি যুক্ত করার আগে "চালান লাইনের" একটি সেট গোল করুন,
  • বা এগুলি যোগ করুন তারপরে মোট গোল করুন

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

(যুক্তরাজ্যে যখন আমরা দশমিক ব্যাংকগুলিতে অর্ধেক পেন্সের সাথে লেনদেন করতাম না, তবে বেশ কয়েক বছর ধরে এখনও অর্ধেক পেন্সের মুদ্রা ছিল এবং দোকানে প্রায়শই দাম অর্ধেক পেন্সের সমাপ্ত হত - সুতরাং প্রচুর গোলাকার)


8
"দশমিকগুলি বেশিরভাগ অর্থের জন্য ব্যবহৃত হয়" ... এবং সমস্ত কিছু যা কোনও পূর্ণসংখ্যা নয়।
জন Tyree

3
@ জনটিয়ার, সত্য নয় যে বেশিরভাগ সময় ডাবল / ফ্লোট ব্যবহার করা হয় যখন এটি পূর্ণসংখ্যা হয় না। দেখতে stackoverflow.com/questions/2545567/...
ইয়ান Ringrose

3
কি দারুন. আমার পক্ষে হাস্যকর ভুল। Decmialহ্যাঁ, হ্যাঁ দশমিক, না। উত্তরোত্তর জন্য, আমি এখানে মূল অনুভূতির সাথে একমত।
জন Tyree

ব্যাংকাররা ব্যাংকারদের রাউন্ডিং পছন্দ করতে পারে তবে বইয়েরাই এর অনুরাগী নাও থাকতে পারে, তারা বলেছে যে 0.005 পার্থক্যটি গোলাকার হতে পারে 0.01 দ্বারা গোল হয়ে যাবে, এটি নির্ভর করে না এটি বিজোড় বা সংখ্যার উপর নির্ভর করে না।
জাস্টামার্টিন

0

রাউন্ড ফাংশনটির মতো আরও একটি ওভারলোড ব্যবহার করুন:

decimal.Round(2.5m, 0,MidpointRounding.AwayFromZero)

এটি 3 আউটপুট হবে । এবং যদি আপনি ব্যবহার

decimal.Round(2.5m, 0,MidpointRounding.ToEven)

আপনি ব্যাঙ্কার এর বৃত্তাকারী পাবেন।


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