PDA

مشاهده نسخه کامل : مشکل در اعداد Float و Double



life24
24-09-13, 10:00
سلام
عدد 123.320140 را داریم از نوع دابل.
حال قسمت اعشاری را به هر روشی که دوست داریم. می کشیم بیرون. اما عدد آن چیزی نیست که ما انتظار داریم
البته در Console.Write بله. اما هنگام تریس کردن و یافتن دقیق کد مشکل و خطا داریم.
کسی می دونه چرا؟ چرا این خطا در دابل و فلوت وجود داره؟ بیشتر دوست دارم بدانم چطور محاسبه میشود که این خطا وجود دارد و در نوع داده دسیمال این مشکل نیست.
:give_rose:

ravegoat
25-09-13, 22:46
سلام!

شما به چه روشی قسمت اعشاری رو استخراج می کنید؟ مسلما روش اجرای این کار مهمه.

بعد خطایی که شما بهش اشاره دارید یک خطای محاسباتی هستش و یا یک خطای منطقی در خطوط برنامه به هنگام کامپایل یا اجرا؟

دو خط آخر سوالتون رو هم اصلا" متوجه نشدم.

:give_rose:

life24
26-09-13, 08:18
سلام!

شما به چه روشی قسمت اعشاری رو استخراج می کنید؟ مسلما روش اجرای این کار مهمه.

بعد خطایی که شما بهش اشاره دارید یک خطای محاسباتی هستش و یا یک خطای منطقی در خطوط برنامه به هنگام کامپایل یا اجرا؟

دو خط آخر سوالتون رو هم اصلا" متوجه نشدم.

:give_rose:
سلام
با توابع آماده سی شارپ .مثل Truncate قسمت صحیح برمیدرایم و از کل عدد کم میکنیم.


double i = 12.30214;
double a = i - Math.Truncate(i);


حال a برابر است با 0.30213999999999963

ravegoat
28-09-13, 12:27
مشکل به خاطر اینه که متغیر هایی مثل Double از نوع Binary Floating Point هستن و در نمایش اعشاری ده دهی مشکل دارن. به عبارتی نمی تونن تمام اعداد رو به دلیل محدودیت در ظرفیت حافظه پوشش بدن در نتیجه اعدادی که در دامنه ی تعریفشون نباشه رو به نزدیک ترین عدد تعریف شده در اون فضا گرد می کنن. در حالی که اگر مقدار صحیح عدد بزرگ نباشه، متغیر Decimal به خوبی این اعداد اعشاری رو تا ارقام معین پوشش میده.

برای اطلاعات بیش تر:
c# - Problems with Math.Truncate(num) - Stack Overflow (Only the registered members can see the link)
Binary floating point and .NET (Only the registered members can see the link)
A Tutorial on Data Representation - Integers, Floating-point numbers, and characters (Only the registered members can see the link)
IBM Compilers (Only the registered members can see the link)