برای محاسبه چند عدد اعشاری متغیرهایی از نوع 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 برای کار با اعداد اعشاری در سی شارپ استفاده می شوند. اما در نگهداری اطلاعات به صورت باینری تفاوت هایی میان این Data Type ها وجود دارد.
به طور خلاصه از این نوع DataType ها برای مقادیر قابل اندازه گیری استفاده کنید. یعنی برای مقادیری که دقت 99.99 درصدی نیاز دارند. به عنوان مثال فرض کنید می خواهید طول 2 سیم را با هم جمع کنید. یکی 21.36 سانتیمتر است و دیگری 65.21 سانتیمتر. در حالت عادی جمع این دو می شود 86.57.
در double و float دقت اعشار حفظ نمی شود. مثلا ممکن است در جمع بالا عدد 86.5699999 در حافظه ذخیره شود که دقیقا 86.57 نیست ولی خیلی خیلی نزدیک است. البته در نمایش شاید همان 86.57 نمایش داده شود اما در مقایسه 86.56999999 لحاظ می شود.
بنابراین اگر مقادیری دارید که حفظ اعداد اعشار خیلی ریز اهمیت ندارد از این نوع استفاده کنید.
نکته : دقت کنید که double و float دیتاتایپ های سریع تر و سبک تری هستند و نرم افزار شما بهینه تر خواهد بود.
اگر اطلاعاتی دارید که بسیار بسیار دقیق می باشند و حتی کوچکترین مقادیر اعشاری هم مهم می باشد بهتر است از نوع Decimal استفاده کنید. مثلا در محاسبات مالی و بانک ها بهتر است از این نوع دیتاتایپ استفاده شود تا کوچکترین اختلاف حساب ها و ... نیز لحاظ شود.
در مورد سوال شما هم تقریبا واضح هست. احتمالا جمع دو متغیر x و y عددی نزدیک به 0.29999999999 خواهد بود که بسیار بسیار به 0.3 نزدیک است ولی دقیق 0.3 نیست. بنابراین در نمایش همان 0.3 نمایش داده می شود ولی در هنگام مقایسه دچار خطا خواهید شد.
تاریخ :
1402/10/30
- ساعت :
05:11:00 PM
- بازدید :
759
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
09:45:00 PM
- بازدید :
53
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
09:13:00 PM
- بازدید :
33
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
08:31:00 PM
- بازدید :
37
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
12:20:00 PM
- بازدید :
31
- پاسخ :
1
|
تاریخ :
1398/11/03
- ساعت :
06:57:00 PM
- بازدید :
10102
- پاسخ :
1
|
تاریخ :
1403/10/10
- ساعت :
12:44:00 PM
- بازدید :
50
- پاسخ :
1
|
تاریخ :
1398/08/14
- ساعت :
10:54:00 AM
- بازدید :
3020
- پاسخ :
1
|
تاریخ :
1403/10/09
- ساعت :
02:15:00 AM
- بازدید :
52
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
09:35:00 PM
- بازدید :
8472
- پاسخ :
4
|
تاریخ :
1402/11/04
- ساعت :
02:23:00 PM
- بازدید :
932
- پاسخ :
2
|
تاریخ :
1402/10/30
- ساعت :
05:11:00 PM
- بازدید :
759
- پاسخ :
1
|
تاریخ :
1402/10/25
- ساعت :
08:55:00 AM
- بازدید :
890
- پاسخ :
2
|
تاریخ :
1403/10/14
- ساعت :
05:01:00 PM
- بازدید :
26
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
09:45:00 PM
- بازدید :
53
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
09:13:00 PM
- بازدید :
33
- پاسخ :
1
|
تاریخ :
1402/10/30
- ساعت :
09:02:00 AM
- بازدید :
832
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
08:31:00 PM
- بازدید :
37
- پاسخ :
1
|
تاریخ :
1403/10/06
- ساعت :
09:20:00 PM
- بازدید :
105
- پاسخ :
1
|
تاریخ :
1403/10/13
- ساعت :
12:20:00 PM
- بازدید :
31
- پاسخ :
1
|