سوال خود را بپرسید

توضیحات بخش

rss
سوال و جواب برای متخصصان و علاقه مندان به برنامه نویسی در همه زبان ها و همه پلت فرم ها

آمار بخش

کاربران 29
سوال ها 71
پاسخ ها 80
نظر سنجی ها 0

برترین کاربر ها

بیشترین تگ ها

2

محاسبه اشتباه در جمع اعداد اعشاری در جاوا اسکریپت

از ریاضیات می دانیم که

0.1 + 0.2 = 0.3

ولی در جاوااسکریپت وقتی شرطی را به صورت زیر بررسی می کنیم بر خلاف انتظار نتیجه true نمی شود.

var x = 0.1, y = 0.2;
if (x + y == 0.3) {
//do something
}

این مشکل چرا به وجود میاد و چه راه حلی برای اینگونه موارد پیشنهاد می کنید؟
پاسخ به سوال
1957بازدید

پاسخ ها (1)

2
همونجوری که می دونید تو ریاضیات داریم

0.1 + 0.2 = 0.3
ولی بین ریاضی و کامپیوتر تفاوت هایی هست. وقتی در مورد عددی مثل 10 / 1 صحبت می کنیم به عدد 0.1 می رسیم و همانجوری که مشاهده می کنید مشکل خاصی در این محاسبات به وجود نمی آید ولی در همین مبنای 10 اگر مقدار 3 / 1 را حساب کنیم به این نتیجه می رسیم که :

1 / 3 = 0.3333333..... => رقم 3 به صورت بی پایان تکرار می شود
وقتی عددی را در مبنای 10 بر توان هایی از 10 تقسیم می کنیم، نتیجه کاملا درست و تضمین شده است ولی تقسیم بر 3 اینگونه نیست.
در کامپیوتر اعداد در مبنای 10 نیستند و در مبنای 2 هستند یعنی با صفر و یک نمایش داده می شوند. به همین شکلی که گفته شد، وقتی عددی را در مبنای 2 بر توان هایی از 2 تقسیم می کنیم، نتیجه کاملا درست و تضمین شده است ولی تقسیم بر 10 اینگونه نیست.
برای اینکه بدانیم دقیقا چه اتفاقی می افتد کد زیر را اجرا کنید

alert( 0.1.toFixed(20) ); // ==> 0.10000000000000000555

در نتیجه حاصل عبارتی که در متن سوال وارد کرده اید، دقیقا 0.3 نمی شود. البته باید بدانیم که این مسئله فقط برای جاوااسکریپت نیست و در زبان های دیگه مثل PHP, Java,C,Perl,Ruby ,... هم این اتفاق می افتد.
برای حل این مسئله چند راه حل وجود دارد:
  • استفاده از ()toFixed :
دقت کنید این متد نتیجه را به صورت رشته بر می گرداند و باید از + برای تبدیل متن به عدد استفاده کرد.

var x = 0.1,  y = 0.2;
var sum = x + y;
if (+sum.toFixed(2) === 0.3) {
//do something
}

  • استفاده از ضرب و تقسیم :
این روش راه حل صد در صدی نیست ولی در بعضی از موارد درست جواب می دهد.

var x = 0.1, y = 0.2;
var sum = ((x * 10 + y * 10) / 10);
if (sum === 0.3) {
//do something
}

پاسخ به سوال
تعداد حروف 0