PDA

View Full Version : مشکل با تابع Round



shaghayegh_6113
چهارشنبه 28 فروردین 1387, 13:23 عصر
سلام
من با توابع Round و RoundTo و SimpleRound دلفی مشکل دارم
در اصل مشکل به خاطر تابع Round هست که در RounTo و SimpleRound هم از اون استفاده می شه
Round عدد 11.5 میشه 12 ولی Round عدد 12.5 میشه 12
Round عدد 13.5 میشه 14 و Round عدد 14.5 میشه 14 و الاآخر اعداد زوج با 0.5 که Rond میشن رو به پایین Round میشن و همین باعث ایجاد مشکل در RoundTo و SimpleRound برای 0.5 ها می شود
کسی تابع بهتری برای این کار یا چیزی برای رفع این مشکل می دونه
در واقع من می خوام اعدادی که 0.5 دارند رو به بالا گرد شوند

vcldeveloper
چهارشنبه 28 فروردین 1387, 18:53 عصر
در اینجور مواقع حتما یه نگاهی هم به Help دلفی بندازید:


If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called "Banker’s Rounding".
و...

The behavior of Round can be affected by the Set8087CW procedure or SetRoundMode function
یعنی اگر یونیت Math را به uses اضافه کنید و SetRoundMode را با پارامتر rmUp قبل از Round فراخوانی کنید، نتیجه مورد نظر شما حاصل میشه.

shaghayegh_6113
جمعه 30 فروردین 1387, 22:56 عصر
ببخشید آقای کشاورز ولی این چیزی که شما گفتید ربطی به مشکل من نداشت
شاید مشکل رو درست متوجه نشدید
اگر چیزی رو که گفتم امتحان می کردید حتما متوجه می شدید
شما یک بار برای مثال عدد 12.5 رو و یک بار 11.5 رو Round کنید ببینید چه اتفاقی می افته
در هر دو مورد جواب 12 می شه
به هر حال من مشکلم رو با نوشتن یک تابع جدید از Round حل کردم
البته این راه حل رو یه سایت خارجی برای اعداد اعشاری مثبت پیشنهاد داده بود که من برای منفی ها هم تعمیم اش دادم و از همون Rond به جای Round دلفی در Roundto و SimpleRound استفاده کردم

vcldeveloper
شنبه 31 فروردین 1387, 02:15 صبح
ببخشید آقای کشاورز ولی این چیزی که شما گفتید ربطی به مشکل من نداشت
شاید مشکل رو درست متوجه نشدید
اگر چیزی رو که گفتم امتحان می کردید حتما متوجه می شدید
شما یک بار برای مثال عدد 12.5 رو و یک بار 11.5 رو Round کنید ببینید چه اتفاقی می افته
در هر دو مورد جواب 12 می شه
به هر حال من مشکلم رو با نوشتن یک تابع جدید از Round حل کردم
اگر مطالبی که از Help دلفی کپی کردم رو خونده بودید، متوجه می شدید که کاملا مرتبط با سوال شما بود!
در اونجا توضیح داده شده که هر گاه پارامتر ورودی تابع Round دقیقا بین دو عدد قرار گرفته باشه (یعنی روی 0.5 باشه)، تابع Round عدد اعشاری رو به نزدیکترین عدد زوج روند میکنه؛ یعنی اگه 11.5 بهش بدید، نزدیکترین عدد زوج بهش میشه 12، اگر 12.5 هم بهش بدید، نزدیکترین عدد زوج بهش باز هم میشه 12. همونجا توضیح داده شده که به این روش از روند کردن میگن Banker's Rounding.

در متن دومی که کپی کردم، توضیح داده شده که این رفتار تابع Round را میشه با استفاده از تابع SetRoundMode تغییر داد. شما در پست خودتون اشاره کردید که می خواید عدد اعشاری همیشه رو به بالا گرد بشه. در جواب هم به شما گفتم که اگر قبل از فراخوانی تابع Round، تابع SetRoundMode را با پارامتر rmUP فراخوانی کنید، رفتار تابع Round تغییر کرده و همیشه عدد اعشاری را به بالا گرد میکنه؛ یعنی اگر بهش 11.5 بدید، نتیجه میشه 12 و اگر بهش 12.5 بدید، نتیجه میشه 13.

خوندن 2 خط متن انگلیسی ساده و یک خط توضیح فارسی، کار خیلی سختی نیست!

matinebi
پنج شنبه 12 دی 1387, 07:20 صبح
اگه ممکن هست کد مربوط برای روند کردن عدد رو که همیشه به بالا روند کنه رو بنویسید

تشکر