دلیل خطای محاسبه در نوع داده ای double در سی شارپ
برای محاسبه چند عدد اعشاری متغیرهایی از نوع double تعریف کردم. ولی نتیجه نهایی اشتباه می باشد. لطفا بفرمایید چرا نوع داده ای double در محاسبه و جمع اعداد اعشاری دچار خطا می شود ؟
double x = 0.1;
double y = 0.2;
if (x + y == 0.3)
{
MessageBox.Show("Sum is Correct.");
}
else
{
MessageBox.Show("Sum is InCorrect.");
}
در مثال بالا بلوک else اجرا میشه. حالا اگر متغیرها رو از نوع decimal تعریف کنیم پیغام "Sum is Correct" نمایش داده میشه.
پاسخ هوش مصنوعی
نوع داده ای double
در سی شارپ و دیگر زبان های برنامه نویسی که از نمایندگی IEEE 754 برای اعداد اعشاری استفاده می کنند، عمدتاً برای نمایش اعداد اعشاری طراحی شده است. اما در این روش نمایش، ممکن است برخی از اعداد اعشاری به صورت دقیق نمایش داده نشوند، که این مسأله می تواند منجر به خطاهای محاسباتی شود.
در مثال شما، جمع 0.1
و 0.2
نمی تواند به طور دقیق 0.3
شود به دلیل اینکه 0.1
و 0.2
به صورت باینری نمی توانند به صورت دقیق ذخیره شوند. برای همین جمع این دو عدد ممکن است چیزی نزدیک به 0.3
باشد اما دقیقاً با آن برابر نیست.
به عنوان یک راه حل، اگر نیاز به دقت بیشتری دارید، می توانید از نوع داده ای decimal
استفاده کنید که برای محاسبات مالی و اعداد اعشاری با دقت بالا طراحی شده است. این نوع داده ای از دقت بیشتری برخوردار است و معمولاً در محاسباتی که دقت مهم است، بهتر عمل می کند.
بنابراین، استفاده از decimal
در سناریوهای مشابه به شما کمک خواهد کرد تا از بروز خطاهای ناشی از دقت اعداد در محاسبات جلوگیری کنید.
تفاوت double و float با decimal در اعداد اعشاری
انواع داده ای double و float و decimal برای کار با اعداد اعشاری در سی شارپ استفاده می شوند. اما در نگهداری اطلاعات به صورت باینری تفاوت هایی میان این Data Type ها وجود دارد.
double و float برای نگهداری چه اطلاعاتی مناسب است ؟
به طور خلاصه از این نوع DataType ها برای مقادیر قابل اندازه گیری استفاده کنید. یعنی برای مقادیری که دقت 99.99 درصدی نیاز دارند. به عنوان مثال فرض کنید می خواهید طول 2 سیم را با هم جمع کنید. یکی 21.36 سانتیمتر است و دیگری 65.21 سانتیمتر. در حالت عادی جمع این دو می شود 86.57.
در double و float دقت اعشار حفظ نمی شود. مثلا ممکن است در جمع بالا عدد 86.5699999 در حافظه ذخیره شود که دقیقا 86.57 نیست ولی خیلی خیلی نزدیک است. البته در نمایش شاید همان 86.57 نمایش داده شود اما در مقایسه 86.56999999 لحاظ می شود.
بنابراین اگر مقادیری دارید که حفظ اعداد اعشار خیلی ریز اهمیت ندارد از این نوع استفاده کنید.
نکته : دقت کنید که double و float دیتاتایپ های سریع تر و سبک تری هستند و نرم افزار شما بهینه تر خواهد بود.
decimal برای نگهداری چه اطلاعاتی مناسب است ؟
اگر اطلاعاتی دارید که بسیار بسیار دقیق می باشند و حتی کوچکترین مقادیر اعشاری هم مهم می باشد بهتر است از نوع Decimal استفاده کنید. مثلا در محاسبات مالی و بانک ها بهتر است از این نوع دیتاتایپ استفاده شود تا کوچکترین اختلاف حساب ها و ... نیز لحاظ شود.
در مورد سوال شما هم تقریبا واضح هست. احتمالا جمع دو متغیر x و y عددی نزدیک به 0.29999999999 خواهد بود که بسیار بسیار به 0.3 نزدیک است ولی دقیق 0.3 نیست. بنابراین در نمایش همان 0.3 نمایش داده می شود ولی در هنگام مقایسه دچار خطا خواهید شد.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول