پاسخ ها (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
}
پاسخ به سوال