PHP တွင်ကိန်းဂဏန်းတန်ဖိုးများကိုထုတ်ယူသောအခါအထူးသဖြင့် floating point နံပါတ်များကိုတွက်ချက်သောအခါတိကျမှန်ကန်မှုပြ problem နာကိုသင်မကြာခဏကြုံတွေ့ရလေ့ရှိသည်။ ဘာဖြစ်လို့လဲဆိုတော့ကွန်ပျူတာရဲ့နောက်ခံအလွှာကသူတို့ကိုယ်စားကိုယ်စားပြုတဲ့ binary floating point နံပါတ်များကိုအသုံးပြုတဲ့အတွက်ကြောင့်ဒ decimal မကိန်းတွေကဒ decimal မကိန်းတွေဟာ binary နဲ့တိတိကျကျပြောင်းလဲခြင်းမပြုနိုင်ပါ။
PHP သည် IEEE 754 စံသတ်မှတ်ချက်အရတန်ဖိုးများကိုအပိုင်းသုံးပိုင်းခွဲထားသည့် floating-point နံပါတ်များကိုကိုယ်စားပြုရန် IEEE 754 စံနှုန်းကိုအောက်ပါအတိုင်းဖော်ပြထားသည်။ အချို့သောဒ dec မကိန်းများကို (0.1 or 0.2 ကဲ့သို့သော 0.2 ကဲ့သို့) ကိုကူးပြောင်းသောအခါအသေးအဖွဲဒိုမော်စောင်းရှိသောတံဆိပ်တုံးကိုမကြာခဏဖြစ်ပေါ်လေ့ရှိပြီးအမှားများကိုဖြစ်ပေါ်စေသည်။
$number = 0.1 + 0.2;
echo $number; // ထုတ်လုပ်ခြင်း 0.30000000000000004
အထက်ပါကုဒ်တွင် 0.1 နှင့် 0.2 ၏ပေါင်းလဒ်သည် 0.3 ဖြစ်သင့်သည်။ သို့သော်အောက်ခြေရှိ floating-point နံပါတ်များကိုခန့်မှန်းခြေကိုယ်စားပြုမှုကြောင့်ရလဒ်ရလဒ်မှာမမျှော်လင့်သောအမှားများရှိသည်။
$price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total; // ထုတ်လုပ်ခြင်း 0.80
ရလဒ်သည် output မှ 0.80 ဖြစ်သော်လည်းပိုမိုရှုပ်ထွေးသောလုပ်ငန်းများ (သို့) နှိုင်းယှဉ်လုပ်ဆောင်မှုများတွင်ထိုကဲ့သို့သောအမှားအယွင်းများသည်ယုတ္တိဆိုင်ရာတရားစီရင်ခြင်းအမှားများသို့မဟုတ်တိကျသောငွေကြေးတွက်ချက်မှုများဖြစ်ပေါ်စေနိုင်သည်။
ဘုံလှည့်ကွက်တစ်ခုမှာ floating point နံပါတ်များကိုတွက်ချက်မှုတွင်ပါ 0 င်ရန်ကိန်းဂဏန်းများအဖြစ်ပြောင်းလဲရန်ဖြစ်သည်။ ဤနည်းလမ်းသည်တိုင်းတာခြင်းသို့မဟုတ်တိုင်းတာခြင်းတွက်ချက်မှုများတွင်တိကျမှန်ကန်မှုအမှားများကိုပိုမိုတိကျမှန်ကန်စွာအမှားအယွင်းများကိုရှောင်ရှားရန်အခြေအနေများအတွက်သင့်တော်သည်။
$price = 10;
$quantity = 8;
$total = $price * $quantity / 10;
echo $total; // ထုတ်လုပ်ခြင်း 8.0
ဤနည်းလမ်းသည်မူရင်း 0.8 နှင့် 1.0 မှ 10 မှ 10 မှ 8 နှင့် 8 ကိုကိန်းပွားရန်အတွက် plantress မြှင့်တင်ခြင်းဖြင့် floinging point အမှားများကိုရှောင်ရှားပြီးနောက်ဆုံးတွင်တိကျမှန်ကန်မှုကိုပြန်လည်ပြုလုပ်ရန် 10 ဖြင့်ခွဲဝေပေးသည်။
PHP ၏ built-in BCMATIT တိုးချဲ့ခြင်းသည်ရေပေါ်အမှတ်စဉ်တိကျမှန်ကန်မှုပြ problem နာကိုဖြေရှင်းရန်ဒီဇိုင်းပြုလုပ်ထားသည်။ developer များက developer များကို string mode တွင်မတရားတိကျမှုဖြင့်အနုညာမထားသည့်အယူအဆများကိုလုပ်ဆောင်ရန်ခွင့်ပြုသည်။
echo bcadd('0.1', '0.2', 1); // ထုတ်လုပ်ခြင်း 0.3
BCMATH မှ BCADD (BCADD) function သည်ကိန်းဂဏန်းများပြားချပ်ချပ်ကြိုးများနှင့်သိုလှောင်ထားသောဒ decimal မတည်ရှိသည့်ဒ decimal မတည်ရှိသည့်နေရာနှစ်ခုကိုရရှိသည်။
အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင်အထူးသဖြင့်ဘဏ် finance ာရေး, စာရင်းနှင့်အပိုင်းကိန်းတွက်ချက်မှုစသည့်စီးပွားရေးအခြေအနေများတွင်ဖွံ့ဖြိုးရေးတွက်ချက်မှုများအတွက် PHP မှဇာတိ floating point နံပါတ်များကိုအသုံးပြုခြင်းကိုရှောင်ရှားရန်အရေးကြီးသည်။ တိကျမှန်ကန်မှုကိုတိကျမှန်ကန်စွာလိုအပ်သည့်နေရာများတွင် BCMath တိုးချဲ့မှုကိုအသုံးပြုရန်အကြံပြုသည်။