یکی از سالم‌ترین سرگرمی‌های هر برنامه‌نویس Backend ی فحش دادن به جاوااسکریپت است و پریروز در پایان ساعت کاری همین بحث شیرین در در جریان بود. از میان ویژگی‌های داغان بی‌شمار این زبان زیبا و دوست‌داشتنی، نوبت به این نکته رسید که شاید باورش برایتان سخت باشد اما این اتفاق کاملا درست و منطقی است! بله! حاصل جمع . و . برابر با . نیست و این گزاره کاملا درست و منطقی است: ) اینکه . + . مساوی . نمیشه، منطقی‌ه؟ منطقیییی؟ : ) بله آقا! بله! منطقی است: ) ماجرا به نحوه‌ی پردازش و ذخیره‌سازی اعداد در کامپیوتر بر می‌گردد. تکلیف اعداد طبیعی مثل و و روشن است، مستقیم نمایش دودویی آنها ذخیره می‌شود و به راحتی مقدار اصلی نیز بازیابی می‌شود. اعداد منفی نیز به همین شیوه و گرفتن مکمل ذخیره می‌شوند. اما برای اعداد اعشاری که از دو قسمت صحیح و اعشار تشکیل شده است چه می‌توان کرد؟ بب ر! پاسخ اول به این سوال یک راه‌حل ساده است! محل ذخیره را سه قسمت کن! قسمت اول که علامت عدد را نشان می‌دهد (صفر یعنی عدد ذخیره‌شده مثبت است و یک یعنی منفی است) ، قسمت دوم را برای ذخیره‌سازی قسمت صحیح عدد اعشاری استفاده کن و قسمت سوم را برای ذخیره‌سازی اعشار آن. یعنی اگر بیت فضا به این شکل تقسیم شود که بیت برای قسمت صحیح عدد و بیت برای ذخیره‌ی اعشار، در اینصورت بزرگترین عدد اعشاری‌ای که با این روش می‌توان ذخیره کرد . است! به بیان دیگر این روش همیشه یک پنجره در دست دارد که هر رقمی که بیرون از این پنجره قرار بگیرد را می‌ب ر د و بدور می‌ریزد! به روش قبل، روش ممیز ثابت ( fixed point ) برای ذخیره‌سازی اعداد اعشاری می‌گویند. تکون بده! ممیز رو تکون بده! راه‌حل دوم اما اهل مدارای بیشتری است! ایده‌ی کلی این است که قبل از ذخیره‌ی عدد اعشاری، آنرا نرمال کنیم و بصورت نمایش علمی بنویسیم. مثلا نمایش علمی . میشود . در ده به توان ، به معنای دیگر، بجای آنکه پنجره بدست همه را با یک چشم بسنجیم، اول آنها را در شرایط نرمال قرار می‌دهیم و سپس آنها را ذخیره می‌کنیم! به این روش، روش ممیز شناور می‌گویند. طبق تصویر بالا می‌خواهیم عدد . را ذخیره کنیم. ابتدا آنرا به صورت دودویی‌اش تبدیل می‌کنیم و سپس آنرا نرمال می‌کنیم. متناظر با هر رنگ جدول زیر را در نظر می‌گیریم: از سمت راست، رنگ طلایی متناظر با ارقام طلایی است، به این ارقام، ارقام بامعنا می‌گوییم. منفی چهار در نمایش نرمال . را بصورت مکمل دو در قسمت سبزرنگ ذخیره می‌کنیم و در نهایت اون آبی روشن خوشگله هم نمایانگر مثبت یا منفی بودن عدد است! خخخببببب؟ تا اینجا دیدیم که چگونه یک عدد ناصحیح را می‌توان در کامپیوتر ذخیره کرد. به عنوان پست بر می‌گردیم و در نمایش باینری، جمع را انجام می‌دهیم: به نظر شما نمایش دهدهی عدد سبز رنگ چه مقداری است؟ : ) دقیقا! . : ) یعنی چی این؟ : ) ریاضی کشک؟ همه چی کشک؟ نه! یک قضیه در آنالیز ریاضی وجود دارد که هر عدد گویا دارای بسط دودویی مختوم یا تکراری است و هر بسط مختومی با یک بسط نامختوم تکراری معادل است! از عکس نقیض این گزاره نتیجه می‌شود که اعداد گنگ بسط دودویی نامختوم و ناتکراری دارند!‌بنابراین هر عدد دارای یک بسط نامختوم است اما مشکل اینجاست که کامپیوتر دارای فضای محدود است! برای مثال در دقت معمولی تنها بیت فضا برای ذخیره‌ی یک عدد اعشاری در نظر گرفته می‌شود که از آن بیت برای علامت عدد است، بیت برای ذخیره‌ی مکمل دوی نما و بیت برای ذخیره‌ی ارقام بامعنا (جدول رنگی چند پاراگراف بالاتر را ببینید! این وسط حتی اگر جمع در یک فضای با دقت بزرگتر انجام شود، در نهایت تعداد محدودی از آن ذخیره می‌شوند. در این بین انباشتگی بیت‌ها در هنگام جمع در آن فضای بزرگتر موجب می‌شود تا در هنگام برش، احتمالا تنی چند از بیت‌ها صورت متفاوتی نسبت به آنچه با تبدیل مستقیم بدست می‌آید را داشته باشند، این همان چیزی که شرط در تصویر اول را غلط می‌کند و آن آخر را تولید می‌کند! در نهایت با این توضیحات رفتار پایتون و جاوااسکریپت و هر زبان دیگری به نظر منطقی است. چه کنیم؟ در محاسبات و با توجه به دقت موردنیاز دقت را از بین معمولی ( float یا single ) یا بیتی، مضاعف ( double ) یا بیتی و توسیع‌یافته ( extended ) یا بایتی انتخاب کنید. اگر در سیستم مالی‌ای کار می‌کنید که نیاز است تا رقم اعشار اعداد دقیق باشند، در هنگام ارسال اطلاعات، عدد محاسبه شده‌ی خود را تا رقم اعشار گرد کنید. مثلا سند خوبی است! باور کنید مباحث آن درس در زندگی روزمره کاربرد عملی دارد! به خدا قسم: ) خطاست دیگه! سخت نگیر.