ম্যাথ.রাউন্ড (2.5) এর পরিবর্তে 2 কেন ফেরায়?


415

সি # তে ফলাফল 2 Math.Round(2.5)is

এটি 3 হওয়ার কথা, তাই না? কেন এটি সি # এর পরিবর্তে 2?


5
এটি আসলে একটি বৈশিষ্ট্য। <a href=" msdn.microsoft.com/en-us/library/… এমএসডিএন ডকুমেন্টেশন </ em> দেখুন This microsoft.com/en-us/library/… ওভারলোড </a> যা কলারকে কীভাবে রাউন্ডিং করবেন তা নির্দিষ্ট করতে দেয়।
জো

1
স্পষ্টতই বৃত্তাকার পদ্ধতিটি যখন দুটি সংখ্যার মাঝে ঠিক একটি সংখ্যাকে গোল করতে বলা হয়, তখনও সমান পূর্ণসংখ্যা প্রদান করে। সুতরাং, ম্যাথ.রাউন্ড (3.5) ফিরে 4 এই নিবন্ধটি
ম্যাথু জোন্স

20
Math.Round(2.5, 0, MidpointRounding.AwayFromZero);
রবার্ট ডারগিন

এসকিউএল সার্ভারটি সেভাবে ঘুরছে; টি-এসকিউএল-তে একটি সি # ইউনিট পরীক্ষা টি-র মেয়াদ নির্ধারণের পরীক্ষা করার পরে আকর্ষণীয় পরীক্ষার ফলাফল।
idstam

7
@ নামক এটি কোনও বাগ নয়। এটি বাইনারি ভাসমান পয়েন্টগুলি কাজ করার উপায়। 1.005ডাবল ঠিক প্রতিনিধিত্ব করা যাবে না। এটা সম্ভবত 1.00499...। আপনি যদি Decimalএই সমস্যাটি ব্যবহার করেন তবে অদৃশ্য হয়ে যাবে। গণিতের অস্তিত্ব R রাউন্ড ওভারলোড যা দ্বিগুণে দশমিক সংখ্যা নেয় a এটি একটি সন্দেহজনক ডিজাইন পছন্দ আইএমও, কারণ এটি খুব কমই অর্থবহ উপায়ে কাজ করবে।
কোডসইনচাউস

উত্তর:


560

প্রথমত, এটি যাইহোক কোনও সি # বাগ হবে না - এটি একটি নেট নেট হবে। সি # হল ভাষা - এটি কীভাবে Math.Roundপ্রয়োগ করা হয় তা সিদ্ধান্ত নেয় না ।

এবং দ্বিতীয়ত, না - আপনি যদি ডকগুলি পড়ে থাকেন তবে আপনি দেখতে পাবেন যে ডিফল্ট রাউন্ডিংটি "রাউন্ড টু সম" (ব্যাঙ্কারের গোলাকার) হয়:

প্রত্যাবর্তনের মানের
ধরণ: সিস্টেম.ডোবেল সংখ্যার
নিকটতম যদি একটিটির ভগ্নাংশের উপাদানটি দুটি পূর্ণসংখ্যার মাঝখানে হয়, যার একটি সমান এবং অন্যটি বিজোড় হয়, তবে সমান সংখ্যাটি ফিরে আসে। নোট করুন যে এই পদ্ধতিটি Doubleএকটি অবিচ্ছেদ্য ধরণের পরিবর্তে একটি ফেরত দেয় ।

মন্তব্যসমূহ
এই পদ্ধতির আচরণটি আইইইই স্ট্যান্ডার্ড 754, বিভাগ 4 অনুসরণ করে This এই ধরণের রাউন্ডিংটিকে কখনও কখনও নিকটতম, বা ব্যাঙ্কারের গোলাকৃতি বলে। এটি বৃত্তাকার ত্রুটিগুলি হ্রাস করে যা ধারাবাহিকভাবে একটি একক দিকের মিডপয়েন্ট মানটি গোল করে।

কোনও ওভারলোড যা একটি মান নেয় তা Math.Roundব্যবহার করে মিড পয়েন্টগুলি কীভাবে গোল করা উচিত তা আপনি নির্দিষ্ট করতে পারেন । প্রতিটি ওভারলোডের সাথে একটি করে ওভারলোড রয়েছে যার একটি নেই:MidpointRoundingMidpointRounding

এই ডিফল্টটি ভালভাবে নির্বাচিত হয়েছিল কি না তা আলাদা বিষয়। ( MidpointRoundingকেবলমাত্র নেট .০.০ এ পরিচয় করিয়ে দেওয়া হয়েছিল। তার আগে আমি নিশ্চিত না যে নিজেরাই না করে কাঙ্ক্ষিত আচরণ বাস্তবায়নের কোনও সহজ উপায় ছিল।) বিশেষত, ইতিহাস দেখিয়েছে যে এটি প্রত্যাশিত আচরণ নয় - এবং বেশিরভাগ ক্ষেত্রেই এটি এপিআই ডিজাইনে একটি মূল পাপ sin ব্যাঙ্কারের রাউন্ডিং কেন দরকারী তা আমি দেখতে পাচ্ছি ... তবে এটি এখনও অনেকের কাছেই অবাক।

আপনি নিকটতম জাভা সমতুল্য এনাম ( RoundingMode) যা আরও আরও বিকল্প প্রস্তাব দেয় তা একবার দেখতে আগ্রহী হতে পারেন । (এটি কেবল মিডপয়েন্টগুলির সাথে কাজ করে না))


4
আমি জানি না এটি কোনও ত্রুটিযুক্ত কিনা, আমি মনে করি এটি নকশা দ্বারা তৈরি হয়েছিল, যেহেতু .5 সবচেয়ে নিকটতম নিম্নতম পূর্ণসংখ্যার নিকটবর্তী হিসাবে এটি নিকটতম সর্বোচ্চ পূর্ণসংখ্যার কাছে।
স্টান আর

3
VB- র মধ্যে এই আচরণটি আমার মনে আছে। নেট প্রয়োগ হয়েছে।
জন ফায়ালা 20

7
প্রকৃতপক্ষে, আইইইইই স্ট্যান্ডার্ড 754, বিভাগ 4 নথি হিসাবে উল্লেখ করা হয়েছে।
জন স্কিটি

2
আমি কিছুক্ষণ আগে এর দ্বারা জ্বলে উঠলাম এবং ভেবেছিলাম এটিও নিছক পাগল। ভাগ্যক্রমে তারা রাউন্ডিং নির্দিষ্ট করার জন্য একটি উপায় যুক্ত করেছে যা আমরা প্রত্যেকে গ্রেড-স্কুলে শিখেছি; MidPointRounding।
শেয়া

26
"এটি প্রত্যাশিত আচরণ নয় [...] এটি এপিআই ডিজাইনের ক্ষেত্রে একটি গুরুতর পাপ"
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

215

একে রাউন্ডিং অব ইওন (বা ব্যাঙ্কারের গোলাকার) বলা হয়, যা অঙ্কের পরিমাণে ত্রুটিগুলি হ্রাস করার জন্য একটি বৈধ রাউন্ডিং কৌশল (MidpointRounding.ToEven)। তত্ত্বটি হ'ল, আপনি যদি সর্বদা একই দিকের 0.5 টি সংখ্যাকে গোল করেন তবে ত্রুটিগুলি দ্রুত বৃদ্ধি পাবে (বৃত্তাকার থেকে সমান যে এটি হ্রাস করা উচিত) (ক)

এমএসডিএন বর্ণনার জন্য এই লিঙ্কগুলি অনুসরণ করুন:

  • Math.Floor, যা নেতিবাচক অনন্তের দিকে গোল করে।
  • Math.Ceiling, যা ইতিবাচক অনন্তের দিকে ঘুরছে।
  • Math.Truncate, যা গোল অথবা উপরে শূন্যের দিকে।
  • Math.Round, যেটি নিকটতম পূর্ণসংখ্যা বা দশমিক জায়গাগুলির নির্দিষ্ট সংখ্যায় গোল হয়। আপনি যদি আচরণটি নির্দিষ্ট করে দিতে পারেন তবে এটি দুটি সম্ভাবনার মধ্যে একেবারে সামঞ্জস্যপূর্ণ, যেমন রাউন্ডিং যাতে চূড়ান্ত অঙ্কটি সমান হয় (" Round(2.5,MidpointRounding.ToEven)" 2 হয়) বা যাতে এটি শূন্য থেকে দূরে (" Round(2.5,MidpointRounding.AwayFromZero)" হয়ে 3) হয়।

নিম্নলিখিত চিত্র এবং সারণি সাহায্য করতে পারে:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====
Floor                    -3      -1      0      1      2
Ceiling                  -2       0      1      2      3
Truncate                 -2       0      0      1      2
Round(ToEven)            -3       0      0      2      3
Round(AwayFromZero)      -3      -1      0      2      3

দ্রষ্টব্য যে Roundএটি মনে হয় তার থেকে অনেক বেশি শক্তিশালী, কেবলমাত্র এটি নির্দিষ্ট দশমিক জায়গার সাথে গোল করতে পারে। অন্য সবসময় সর্বদা শূন্য দশমিক to উদাহরণ স্বরূপ:

n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

অন্যান্য ক্রিয়াকলাপগুলির সাথে, আপনাকে একই প্রভাব অর্জন করতে গুণ / বিভাজন কৌশল ব্যবহার করতে হবে:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

(ক) অবশ্যই, এই তত্ত্বটি নির্ভর করে যে আপনার ডেটা সমান অংশ (0.5, 2.5, 4.5, ...) এবং বিজোড় অর্ধেক (1.5, 3.5, ...) জুড়ে মোটামুটি এমনকি মানগুলির ছড়িয়ে পড়েছে on

তাহলে সব "অর্ধ মান হল" evens (উদাহরণস্বরূপ) হয়, ত্রুটি ঠিক যেমন দ্রুত জমা যেন আপনি সবসময় বৃত্তাকার আপ হবে।


3
ব্যাঙ্কারের রাউন্ডিং হিসাবেও পরিচিত
পন্ডিদাম

ভাল ব্যাখ্যা! আমি কীভাবে ত্রুটিটি জমে তা আমি নিজের কাছে দেখতে চেয়েছিলাম এবং আমি একটি স্ক্রিপ্ট লিখেছিলাম যা দেখায় যে মানদণ্ডগুলি ব্যাংকারের বৃত্তাকার ব্যবহার করে দীর্ঘমেয়াদে, তাদের পরিমাণগুলি এবং গড়গুলি মূল মানেরগুলির সাথে অনেক বেশি কাছাকাছি থাকে। github.com/AmadusW/ রাউন্ডিংডেমো (প্লটগুলির ছবি উপলভ্য)
Amadeusz Wieczorek

এর অল্প সময়ের পরে: e(= 2.8) টিক দিয়ে টিক দেওয়া উচিত নয় 2?
সুপারজোজ

মনে রাখার একটি সহজ উপায় এবং দশম স্থান ধরে নেওয়া 5: - স্থানগুলি এবং দশম স্থানটি সমস্ত বিজোড় = বৃত্তাকার - একটি স্থান এবং দশম স্থান মিশ্রিত হয় = বৃত্তাকার নিচে * জিরো বিজোড় নয় * negativeণাত্মক সংখ্যার জন্য বিপরীত
আরখাম অ্যাঞ্জেল

@ আরখামএঞ্জেল, এটি "শেষ
সংখ্যাটি

42

এমএসডিএন থেকে , ম্যাথ। রাউন্ড (ডাবল এ) রিটার্ন:

পূর্ণসংখ্যা নিকটতম a। যদি একটিটির ভগ্নাংশের উপাদানটি দুটি পূর্ণসংখ্যার মাঝখানে হয়, যার একটি সমান এবং অন্যটি বিজোড় হয়, তবে সমান সংখ্যাটি ফিরে আসে।

... এবং তাই 2.5, 2 এবং 3 এর মাঝামাঝি হয়ে, সমান সংখ্যায় (2) গোলাকার হয়। এটিকে ব্যাঙ্কার্স রাউন্ডিং (বা রাউন্ড-টু- ইও - ইওন ) বলা হয় এবং এটি সাধারণত ব্যবহৃত গোলাকার মান।

একই এমএসডিএন নিবন্ধ:

এই পদ্ধতির আচরণটি আইইইই স্ট্যান্ডার্ড 754, বিভাগ 4 অনুসরণ করে This এটি বৃত্তাকার ত্রুটিগুলি হ্রাস করে যা ধারাবাহিকভাবে একটি একক দিকের মিডপয়েন্ট মানটি গোল করে।

আপনি ম্যাথের ওভারলোডগুলিকে কল করে একটি ভিন্ন রাউন্ডিং আচরণ নির্দিষ্ট করতে পারেন ound রাউন্ড যা কোনও MidpointRoundingমোড নেয়।


37

আপনার জন্য এমএসডিএন পরীক্ষা করা উচিত Math.Round:

এই পদ্ধতির আচরণটি আইইইই স্ট্যান্ডার্ড 754, বিভাগ 4 অনুসরণ করে This

আপনি Math.Roundএকটি ওভারলোড ব্যবহারের আচরণটি নির্দিষ্ট করতে পারেন :

Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // gives 3

Math.Round(2.5, 0, MidpointRounding.ToEven); // gives 2

31

বৃত্তাকার প্রকৃতি

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

সাধারণ বা 'পাটিগণিত' বৃত্তাকারে এটি পরিষ্কার যে ২.১, ২.২, ২.৩ এবং ২.৪ থেকে ২.০; এবং 2.6, 2.7, 2.8 এবং 2.9 থেকে 3.0।

এটি 2.5 ছেড়ে যায় যা 3.0 এর চেয়ে 2.0 এর কাছাকাছি নয়। ২.০ থেকে ৩.০ এর মধ্যে নির্বাচন করা আপনার উপর নির্ভর করে, হয় হয় সমানভাবে বৈধ হবে।

বিয়োগ সংখ্যার জন্য, -২.১, -২.২, -২.৩ এবং -২.৪, -২.০ হয়ে যাবে; এবং -2.6, 2.7, 2.8 এবং 2.9 গাণিতিক গোলের আওতায় -3.0 হয়ে যাবে।

-2.5 এর জন্য -2.0 এবং -3.0 এর মধ্যে একটি পছন্দ প্রয়োজন।

গোলাকার অন্যান্য ফর্ম

'রাউন্ডিং আপ' দশমিক জায়গাগুলির সাথে যে কোনও সংখ্যা নেয় এবং এটি পরবর্তী 'পুরো' নম্বর করে দেয়। সুতরাং কেবল 2.5 এবং 2.6 থেকে 3.0 পর্যন্ত গোল করবে না, তবে এটি 2.1 এবং 2.2 করুন।

বৃত্তাকার আপ ধনাত্মক এবং নেতিবাচক উভয় সংখ্যা শূন্য থেকে দূরে সরিয়ে দেয়। যেমন। 2.5 থেকে 3.0 এবং -2.5 থেকে -3.0।

'রাউন্ডিং ডাউন' অবাঞ্ছিত অঙ্কগুলি কেটে সংখ্যাগুলি কেটে দেয়। এটির সংখ্যা শূন্যের দিকে এগিয়ে যাওয়ার প্রভাব রয়েছে। যেমন। 2.5 থেকে 2.0 এবং -2.5 থেকে -2.0

"ব্যাঙ্কারের রাউন্ডিং" - এর সর্বাধিক প্রচলিত আকারে - .5 বৃত্তাকার হতে হয় উপরের দিকে বা নীচে গোল করা হয় যাতে বৃত্তাকারীর ফলাফল সর্বদা একটি সংখ্যার হয়। এইভাবে 2.5 টি 2.5, 3.5 থেকে 4.0, 3.5 থেকে 4.0, 5.5 থেকে 6.0 এবং আরও অনেক কিছু,

'অল্টারনেট রাউন্ডিং' কোনও .5 এর জন্য গোলটি ডাউন এবং রাউন্ডিংয়ের মধ্যে প্রক্রিয়াটি পরিবর্তিত করে।

'র্যান্ডম রাউন্ডিং' পুরো র্যান্ডম ভিত্তিতে একটি .5 উপরে বা নীচে s

প্রতিসাম্য এবং অসম্পূর্ণতা

একটি গোলাকার ক্রিয়াকলাপটিকে 'প্রতিসাম্যিক' বলা হয় যদি এটি হয় হয় শূন্য থেকে সমস্ত সংখ্যাকে গোল করে বা সমস্ত সংখ্যা শূন্যের দিকে গোল করে s

একটি ফাংশনটি 'অসমমিত' হয় যদি ইতিবাচক সংখ্যাকে শূন্যের দিকে এবং .ণাত্মক সংখ্যাকে শূন্য থেকে দূরে রাখে .. উদাহরণস্বরূপ। 2.5 থেকে 2.0; এবং -2.5 থেকে -3.0।

অসমমিতিক এমন একটি ফাংশন যা ইতিবাচক সংখ্যাকে শূন্য এবং নেতিবাচক সংখ্যাকে শূন্যের দিকে গোল করে। যেমন। 2.5 থেকে 3.0; এবং -2.5 থেকে -2.0।

বেশিরভাগ সময় লোকেরা প্রতিসম বৃত্তাকার কথা ভাবেন, যেখানে -২.৫ -৩.০ এর দিকে বৃত্তাকার হবে এবং ৩.০ গোল হবে 4.0.০ এর দিকে। (সি # তেRound(AwayFromZero))


28

ডিফল্ট MidpointRounding.ToEven, বা ব্যাংকারদের বৃত্তাকার ( 2.5 হয়ে যায় 2, 4.5 4 হয়ে যায় ) এবং অ্যাকাউন্টিংয়ের জন্য প্রতিবেদন লেখার আগে আমাকে গলা টিপেছিল, সুতরাং আমি যা খুঁজে পেয়েছি তার কয়েকটি শব্দ লিখব, এর আগে এবং এর জন্য অনুসন্ধান করা থেকে এই পোস্ট

এমনকি এই সংখ্যাগুলি (ব্রিটিশ ব্যাঙ্কাররা সম্ভবত!) ছাড়িয়ে যাচ্ছেন এই ব্যাঙ্কাররা?

উইকিপিডিয়া থেকে

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

এটি বিশেষত ব্যাঙ্কিংয়ের পক্ষে গোল করার একটি খুব অদ্ভুত উপায় বলে মনে হচ্ছে, যদি না ব্যাংকগুলি প্রচুর পরিমাণে আমানত গ্রহণ করতে না পারে। £ 2.4m জমা দিন, তবে আমরা এটিকে 2 মিলিয়ন ডলার স্যার বলব।

আইইইই স্ট্যান্ডার্ড 754 1985 সাল থেকে শুরু করে এবং রাউন্ডিংয়ের উভয় পথই দেয় তবে মানদণ্ডের দ্বারা প্রস্তাবিত হিসাবে ব্যাংকারের সাথে। এই উইকিপিডিয়া নিবন্ধটিতে ভাষা কীভাবে রাউন্ডিং বাস্তবায়ন করে তার নীচে একটি দীর্ঘ তালিকা রয়েছে (নীচের কোনওটি ভুল হলে আমাকে সংশোধন করুন) এবং বেশিরভাগ ব্যাংকারদের ব্যবহার করবেন না তবে স্কুলে আপনাকে শেখানো গোলটি:

  • সি / সি ++ রাউন্ড () গণিত থেকে গোল গোল শূন্য থেকে দূরে (ব্যাঙ্কারের গোল নয়)
  • জাভা ম্যাথ। গোলটি শূন্য থেকে দূরে (এটি ফলাফল মেঝেতে 0.5, একটি পূর্ণসংখ্যায় ক্যাসেট যোগ করে)। বিগডিসিমালে একটি বিকল্প আছে
  • পার্ল সি তে একইভাবে ব্যবহার করে
  • জাভাস্ক্রিপ্ট জাভা ম্যাথ.রাউন্ডের সমান।

তথ্যের জন্য ধন্যবাদ. আমি এটা কখনই বুঝতে পারি নি। লক্ষ লক্ষ লোক সম্পর্কে আপনার উদাহরণ এটিকে খানিকটা উপহাস করেছে, তবে আপনি যদি সেন্ট সেন্ট করে দেন, 10 মিলিয়ন ব্যাঙ্ক অ্যাকাউন্টে সুদ দিতে হয় তবে সমস্ত অর্ধ সেন্ট গোল হয়ে গেলে, বা ক্লায়েন্টকে অনেক ব্যয় করতে হবে অর্ধ সেন্ট গোল হয়। সুতরাং আমি এটি সম্মত মানটি কল্পনা করতে পারি। যদিও এটি সত্যই ব্যাঙ্কাররা ব্যবহার করেছেন কিনা তা নিশ্চিত নয়। বেশিরভাগ গ্রাহক প্রচুর অর্থ উপার্জন করার সময় লক্ষ্যমাত্রা লক্ষ্য করবেন না, তবে আমি কল্পনা করতে পারি যে আপনি যদি গ্রাহক-বান্ধব আইন সহ কোনও দেশে বাস করেন তবে এটি আইন দ্বারা বাধ্য হয়
হ্যারাল্ড কপ্পুলস

15

এমএসডিএন থেকে:

ডিফল্টরূপে, ম্যাথ.রাউন্ডটি মিডপয়েন্ট রউন্ডিং ব্যবহার করে o টোভেন। বেশিরভাগ লোক "গোলাকৃতি এমনকি সমান" বিকল্প হিসাবে পরিচিত নন, "শূন্য থেকে দূরে" স্কুলে বেশি পড়াশোনা করা হয়। নেট পরিসংখ্যানগত দিক থেকে উচ্চতর হিসাবে "রাউন্ডিং টু সম" -এর ডিফল্ট কারণ এটি "শূন্য থেকে দূরে সরে যাওয়ার" প্রবণতাটি বৃত্তাকার চেয়ে কিছুটা বেশি বার ভাগ করে না (সংখ্যাকে বৃত্তাকার বলে মনে করে ধনাত্মক বলে মনে হয়)। )

http://msdn.microsoft.com/en-us/library/system.math.round.aspx


3

যেহেতু সিলভারলাইট মিডপয়েন্ট রাউন্ডিং বিকল্পটিকে সমর্থন করে না আপনাকে নিজের লেখা লিখতে হবে। কিছুটা এইরকম:

public double RoundCorrect(double d, int decimals)
{
    double multiplier = Math.Pow(10, decimals);

    if (d < 0)
        multiplier *= -1;

    return Math.Floor((d * multiplier) + 0.5) / multiplier;

}

এটি কীভাবে এক্সটেনশান হিসাবে ব্যবহার করা যায় তার উদাহরণ সহ পোস্টটি দেখুন: নেট এবং সিলভারলাইট রাউন্ডিং


3

আমার এই সমস্যাটি ছিল যেখানে আমার এসকিউএল সার্ভারটি যখন আমার সি # অ্যাপ্লিকেশনটি করেনি, তখন 0.5 থেকে 1 অবধি রয়েছে। সুতরাং আপনি দুটি ভিন্ন ফলাফল দেখতে হবে।

দীর্ঘ / দীর্ঘ সহ একটি বাস্তবায়ন এখানে। এভাবেই জাভা ঘোরে।

int roundedNumber = (int)Math.Floor(d + 0.5);

এটি সম্ভবত আপনি সবচেয়ে কার্যকর পদ্ধতি মনে করতে পারেন।

যদি আপনি এটিকে একটি দ্বৈত রাখতে চান এবং দশমিক নির্ভুলতা ব্যবহার করতে চান, তবে এটি কত দশমিক স্থানের উপর ভিত্তি করে 10 এর এক্সপোটার ব্যবহার করার বিষয়।

public double getRounding(double number, int decimalPoints)
{
    double decimalPowerOfTen = Math.Pow(10, decimalPoints);
    return Math.Floor(number * decimalPowerOfTen + 0.5)/ decimalPowerOfTen;
}

দশমিক পয়েন্টগুলির জন্য আপনি একটি নেতিবাচক দশমিক ইনপুট করতে পারেন এবং এটির শব্দটিও ভাল।

getRounding(239, -2) = 200


0

আপনি যা খুঁজছেন তার উত্তর এই পোস্টে রয়েছে:

http://weblogs.asp.net/sfurman/archive/2003/03/07/3537.aspx

মূলত এটি যা বলে:

ফেরত মূল্য

অঙ্কের সমান নির্ভুলতার সাথে নিকটতম মান সংখ্যা। যদি মান দুটি সংখ্যার মধ্যে অর্ধেক হয়ে যায় যার মধ্যে একটি সমান এবং অন্যটি বিজোড় হয়, তবে সমান সংখ্যাটি ফিরে আসে। মানটির যথার্থতা যদি সংখ্যাগুলির চেয়ে কম হয় তবে মানটি অপরিবর্তিত অবস্থায় ফিরে আসে।

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


0

সিলভারলাইট মিডপয়েন্ট রাউন্ডিং বিকল্পটি সমর্থন করে না। সিলভারলাইটের জন্য এখানে একটি এক্সটেনশন পদ্ধতি যা মিডপয়েন্ট রউন্ডিং এনামকে যুক্ত করে:

public enum MidpointRounding
{
    ToEven,
    AwayFromZero
}

public static class DecimalExtensions
{
    public static decimal Round(this decimal d, MidpointRounding mode)
    {
        return d.Round(0, mode);
    }

    /// <summary>
    /// Rounds using arithmetic (5 rounds up) symmetrical (up is away from zero) rounding
    /// </summary>
    /// <param name="d">A Decimal number to be rounded.</param>
    /// <param name="decimals">The number of significant fractional digits (precision) in the return value.</param>
    /// <returns>The number nearest d with precision equal to decimals. If d is halfway between two numbers, then the nearest whole number away from zero is returned.</returns>
    public static decimal Round(this decimal d, int decimals, MidpointRounding mode)
    {
        if ( mode == MidpointRounding.ToEven )
        {
            return decimal.Round(d, decimals);
        }
        else
        {
            decimal factor = Convert.ToDecimal(Math.Pow(10, decimals));
            int sign = Math.Sign(d);
            return Decimal.Truncate(d * factor + 0.5m * sign) / factor;
        }
    }
}

সূত্র: http://enderly.com/2009/08/08/silverlight-midPoint-rounding-solve/


-1

একটি কাস্টম রাউন্ডিং ব্যবহার করে

public int Round(double value)
{
    double decimalpoints = Math.Abs(value - Math.Floor(value));
    if (decimalpoints > 0.5)
        return (int)Math.Round(value);
    else
        return (int)Math.Floor(value);
}

>.5হিসাবে একই আচরণ উত্পাদন করে Math.Round। দশমিক অংশটি হুবহু হলে প্রশ্নটি ঘটে 0.5। ম্যাথ.রাউন্ড আপনাকে যে ধরণের রাউন্ডিং অ্যালগরিদম চান তা সুনির্দিষ্ট করার অনুমতি দেয়
পানাজিওটিস কানভোস

-2

এটি সমস্ত জাহান্নামের মতোই কুৎসিত, তবে সর্বদা সঠিক গাণিতিক গোল করে produces

public double ArithRound(double number,int places){

  string numberFormat = "###.";

  numberFormat = numberFormat.PadRight(numberFormat.Length + places, '#');

  return double.Parse(number.ToString(numberFormat));

}

5
সুতরাং কল Math.Roundকরে কীভাবে আপনি এটি গোল করতে চান তা উল্লেখ করে।
Configurator

-2

এখানে আমাকে যেভাবে কাজ করতে হয়েছিল তা এখানে:

Public Function Round(number As Double, dec As Integer) As Double
    Dim decimalPowerOfTen = Math.Pow(10, dec)
    If CInt(number * decimalPowerOfTen) = Math.Round(number * decimalPowerOfTen, 2) Then
        Return Math.Round(number, 2, MidpointRounding.AwayFromZero)
    Else
        Return CInt(number * decimalPowerOfTen + 0.5) / 100
    End If
End Function

১ দশমিক ৫৫ দশমিক দুটি দিয়ে চেষ্টা করলে প্রত্যাশিতভাবে 1.91 দেবে Math.Round(1.905,2,MidpointRounding.AwayFromZero)তবে 1.90 দিবে ! গণিত.রাউন্ড পদ্ধতিটি প্রোগ্রামারগুলির মুখোমুখি হতে পারে এমন বেশিরভাগ বেসিক সমস্যার জন্য একেবারেই বেমানান এবং ব্যবহারযোগ্য। আমাকে যা পরীক্ষা (int) 1.905 * decimalPowerOfTen = Math.Round(number * decimalPowerOfTen, 2)করতে হবে তা ডানদিকে নেওয়ার দরকার নেই কিনা I


Math.Round(1.905,2,MidpointRounding.AwayFromZero)রিটার্ন1.91
পানাগিওটিস কানভোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.