কম্পিউটার টিউটোরিয়াল

PHP-তে ফ্লোটিং পয়েন্ট ভ্যালু কমপেরিজন (Comparison of floating point values)

PHP-তে ফ্লোটিং পয়েন্ট ভ্যালুর সমতা টেস্ট করা সমস্যাযুক্ত, কারণ PHP ফেইল করে যখন চেক করা হয় একটি ফ্লোটিং পয়েন্ট নাম্বার অন্যটির সমান কিনা। চাইতে ফ্লোটিং পয়েন্ট নম্বরগুলো একই ভ্যালু দেখাচ্ছে, সেটি আসলেও একই হতে হবে না। তাই এই আর্টিকেলে ফ্লোটিং-পয়েন্ট নম্বর কমপেরিজনে আমরা যে সমস্যায় পড়ি এবং সেটি এড়ানোর বিভিন্ন প্রসেস প্রদর্শন করব।

উদাহরণ

একটি সহজ উদাহরণ দিয়ে পরীক্ষা করি:

<?php 
$a = 0.14; 
$b = 1 - 0.86; // 0.14 
if($a == $b ){ 
    echo 'a and b are same'; 
} 
else { 
    echo 'a and b are not same'; 
} 
?>

আউটপুট:

a and b are not same.

ব্যাখ্যা:

এই কোডে, if কন্ডিশনের বদলে else কন্ডিশন এক্সিকিউট হয়েছে, যদিও $a এবং $b একই। এটি ফ্লোটিং-পয়েন্ট ভ্যালুর বৈশিষ্ট্যের কারণে যে তারা ইন্টারন্যালি কীভাবে রিপ্রেজেন্ট করা হয়। চলুন PHP-তে এই সমস্যা এড়ানোর বিভিন্ন কেস আলোচনা করি।

কেস ১:

কম্পিউটার সিস্টেমে ক্যালকুলেশনে স্মолেস্ট ডিফারেন্স ব্যবহার করে ফ্লোটিং পয়েন্ট ভ্যালুর কমপেরিজন প্রদর্শন।

উদাহরণ:

<?php 
$val1 = 2.183459; 
$val2 = 2.183450; 
$epsilon = 0.00001; 
if(abs($val1 - $val2) < $epsilon) { 
    echo "True"; 
} 
else { 
    echo "False"; 
} 
?>

আউটপুট:

True

ব্যাখ্যা:

এখানে আমরা দুটি ফ্লোটিং পয়েন্ট ভেরিয়েবল val1 এবং val2 সাথেই epsilon ব্যবহার করেছি। তারপর নেটিভ ফাংশন abs() ব্যবহার করে ভেরিয়েবলগুলোর (val1 এবং val2) অ্যাবসোলিউট ডিফারেন্স নেওয়া হয়েছে। এই কোড আমাদের অ্যাবসোলিউট ভ্যালু দেবে কিন্তু প্রশ্ন হলো আমরা কেন অ্যাবসোলিউট ভ্যালু নিচ্ছি? উত্তর হলো আমরা দেখতে পাচ্ছি দুটি ভ্যালুরই ডেসিমালের পর আপ টু প্রিসিশন ভ্যালু ৫ একই, যা PHP-র জন্য কমপেয়ার করা কঠিন।

কেস ২:

round() ফাংশন ব্যবহার।

<?php 
$val1 = 9 - 6.2; 
$val2 = 1.8; 
var_dump(round($val1, 2) == round($val2, 2)); 
?>

আউটপুট:

bool(true)

ব্যাখ্যা:

এখানে আমরা দুটি ফ্লোটিং পয়েন্ট ভেরিয়েবল val1 এবং val2 ব্যবহার করেছি। তারপর প্রিডিফাইনড ফাংশন round() ব্যবহার করেছি যা ফ্লোটিং ভ্যালুগুলো দুটি ডেসিমাল প্লেস পর্যন্ত রাউন্ড অফ করে এবং তারপর কমপেয়ার করে। এখানে আমরা প্রিডিফাইনড round() ফাংশন ব্যবহার করেছি আমাদের এক্সপেক্টেড রেজাল্ট সঠিক পথে পাওয়ার জন্য।

  1. PHP-তে array_count_values() ফাংশন

  2. PHP-তে serializeArray থেকে POST ভ্যালু কিভাবে পাবেন

  3. C#-এ ফ্লোটিং পয়েন্ট লিটারেল কী?

  4. C#-এ ইন্টিজার লিটারেল বনাম ফ্লোটিং পয়েন্ট লিটারেল