জাভাস্ক্রিপ্ট অঙ্ক বুঝে না
JavaScript-এ যখন 0.1 আর 0.2 যোগ করা হয়, তখন 0.3 হওয়ার কথা, কিন্তু আসলে 0.1 + 0.2 = 0.30000000000000004 হয়ে যায়। এটা কেন হয়?
const result = 0.1 + 0.2;
console.log(result);
Output: 0.30000000000000004এইসব সিম্পল যোগ অঙ্ক ভুল করার কারণে মাঝেমধ্যে কোম্পারিজন ঠিক হয় না। তুলনা গড়বড় হয়ে যায়
const first = 0.1;
const second = 0.2;
if(first + second === 0.3){
console.log('they are same');
}
else {
console.log('they are not the same');
}
Output: they are not the sameএকটা তুলনা ভুল হয়ে গেলো। 0.1 আর 0.2 যোগ করলে 0.3 এর সমান হলো না। যদিও আসল ফলাফল 0.30000000000000004 আর এক্সপেক্টেড ফলাফল এর মধ্যে ডিফারেন্স খুবই কম। তারপরেও শর্ত কিন্তু ঠিক না হয়ে ভুল হয়ে গেলো। কি বিপদ!
কেন এই সমস্যা হয়?
জাভাস্ক্রিপ্ট floating point arithmetic ব্যবহার করে। আর এই পদ্ধতির মধ্যে decimal numbers (যেমন: 0.1, 0.2, 0.3)-কে বাইনারি (2-এর ভিত্তিতে) রূপে রূপান্তরিত করা হয়। কিন্তু বাইনারিতে অনেক দশমিক সংখ্যা সঠিকভাবে রূপান্তর করা যায় না। এখানে মূল সমস্যা হচ্ছে, কিছু দশমিক সংখ্যা বাইনারি ফর্মেটে এক্স্যাক্টলি মাপানো সম্ভব হয় না, যার ফলে প্রিসিশন লস (precision loss) হয়।
কীভাবে সংখ্যা রূপান্তরিত হয়?
যেমন: আমরা বলি, 0.1-কে বাইনারি ফর্ম্যাটে কনভার্ট করতে গেলে সেটা হবে—
0.1 = 0.00011001100110011... (অনন্ত দশমিক)
এখানে, 0.1-এর বাইনারি রূপ আসলে finite নয়, অর্থাৎ এটা অনন্ত ডিজিট পর্যন্ত চলে এবং কম্পিউটার তো সেই অনন্ত ডিজিটের সঠিক মান সেভ করতে পারবে না, তাই তা approximate (আনুমানিক) হয়ে যায়। একইভাবে 0.2-এরও ঠিক একই সমস্যা আছে। এর বাইনারি রূপও কিছুটা দীর্ঘ এবং পূর্ণভাবে সঠিকভাবে প্রকাশ করা সম্ভব নয়।
ফলে কী হয়?
অতএব 0.1 আর 0.2 যখন যোগ করা হয়, তখন কম্পিউটার তাদের আনুমানিক বাইনারি মানগুলিকে যোগ করে, কিন্তু যোগফল ঠিক 0.3 হয় না; বরং একটি ছোটখাটো ত্রুটি আসে, যা 0.30000000000000004-এর মতো কিছু হয়ে ওঠে।
যেহেতু floating point-এর মধ্যে ছোট ছোট গুণগত পার্থক্য থাকতে পারে, তাই এমন ধরনের ত্রুটি ঘটে। তবে সাধারণত toFixed() বা toPrecision() ব্যবহার করে এভোয়েড করা যায়।
let result = (0.1 + 0.2).toFixed(1);
console.log(result);
Output: 0.3এই toFixed করে তুলনা করাও যায়।
const first = 0.1;
const second = 0.2;
if ((first + second).toFixed(1) === (0.3).toFixed(1)) {
console.log('they are same');
} else {
console.log('they are not the same');
}
Output: they are sameএই সমস্যা শুধু জাভাস্ক্রিপ্ট এ না বরং পাইথন, জাভা, php এমনকি C++ এও হয়। কারণ এদের সবাই সেইম স্টাইলেই floating point arithmetic ইউজ করে।