دلیل خطای محاسبه در نوع داده ای 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 و 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 نمایش داده می شود ولی در هنگام مقایسه دچار خطا خواهید شد.
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- نمایش صفحه در پنجره جدید با کلیک روی لینک (تگ a) در Asp
- افزودن مقادیر به صورت دستی به List دریافت شده از ریپازیتوری
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول