လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP floating point နံပါတ်တိကျမှန်ကန်မှုအမှားနှင့်ဖြေရှင်းချက်၏နက်ရှိုင်းသောခွဲခြမ်းစိတ်ဖြာခြင်း

PHP floating point နံပါတ်တိကျမှန်ကန်မှုအမှားနှင့်ဖြေရှင်းချက်၏နက်ရှိုင်းသောခွဲခြမ်းစိတ်ဖြာခြင်း

gitbox 2025-06-23

1 ။ PHP floating point အရေအတွက်တိကျမှန်ကန်မှုပြ problems နာများကိုခြုံငုံသုံးသပ်ချက်

PHP တွင်ကိန်းဂဏန်းတန်ဖိုးများကိုထုတ်ယူသောအခါအထူးသဖြင့် floating point နံပါတ်များကိုတွက်ချက်သောအခါတိကျမှန်ကန်မှုပြ problem နာကိုသင်မကြာခဏကြုံတွေ့ရလေ့ရှိသည်။ ဘာဖြစ်လို့လဲဆိုတော့ကွန်ပျူတာရဲ့နောက်ခံအလွှာကသူတို့ကိုယ်စားကိုယ်စားပြုတဲ့ binary floating point နံပါတ်များကိုအသုံးပြုတဲ့အတွက်ကြောင့်ဒ decimal မကိန်းတွေကဒ decimal မကိန်းတွေဟာ binary နဲ့တိတိကျကျပြောင်းလဲခြင်းမပြုနိုင်ပါ။

2 ။ floating point အမှားတစ်ခု root အကြောင်းရင်း

2.1 IEEE 754 floating အမှတ်နံပါတ်ကိုယ်စားပြုမှု

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 နံပါတ်များကိုခန့်မှန်းခြေကိုယ်စားပြုမှုကြောင့်ရလဒ်ရလဒ်မှာမမျှော်လင့်သောအမှားများရှိသည်။

2.2 တိကျမှန်ကန်မှုသွေဖည်ခြင်းဥပမာ

 $price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total;  // ထုတ်လုပ်ခြင်း 0.80

ရလဒ်သည် output မှ 0.80 ဖြစ်သော်လည်းပိုမိုရှုပ်ထွေးသောလုပ်ငန်းများ (သို့) နှိုင်းယှဉ်လုပ်ဆောင်မှုများတွင်ထိုကဲ့သို့သောအမှားအယွင်းများသည်ယုတ္တိဆိုင်ရာတရားစီရင်ခြင်းအမှားများသို့မဟုတ်တိကျသောငွေကြေးတွက်ချက်မှုများဖြစ်ပေါ်စေနိုင်သည်။

3 ။ ဘုံဖြေရှင်းချက်များ

3.1 အမှားအယွင်းများကိုရှောင်ရှားရန်နိုက်တာသောစစ်ဆင်ရေးများကိုအသုံးပြုပါ

ဘုံလှည့်ကွက်တစ်ခုမှာ 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 ဖြင့်ခွဲဝေပေးသည်။

3.2 BCMATH High Puliismatmatics စာကြည့်တိုက်ကိုအသုံးပြုခြင်း

PHP ၏ built-in BCMATIT တိုးချဲ့ခြင်းသည်ရေပေါ်အမှတ်စဉ်တိကျမှန်ကန်မှုပြ problem နာကိုဖြေရှင်းရန်ဒီဇိုင်းပြုလုပ်ထားသည်။ developer များက developer များကို string mode တွင်မတရားတိကျမှုဖြင့်အနုညာမထားသည့်အယူအဆများကိုလုပ်ဆောင်ရန်ခွင့်ပြုသည်။

 echo bcadd('0.1', '0.2', 1);  // ထုတ်လုပ်ခြင်း 0.3

BCMATH မှ BCADD (BCADD) function သည်ကိန်းဂဏန်းများပြားချပ်ချပ်ကြိုးများနှင့်သိုလှောင်ထားသောဒ decimal မတည်ရှိသည့်ဒ decimal မတည်ရှိသည့်နေရာနှစ်ခုကိုရရှိသည်။

4 ။ အကျဉ်းချုပ်နှင့်လက်တွေ့ကျတဲ့အကြံပြုချက်များ

အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင်အထူးသဖြင့်ဘဏ် finance ာရေး, စာရင်းနှင့်အပိုင်းကိန်းတွက်ချက်မှုစသည့်စီးပွားရေးအခြေအနေများတွင်ဖွံ့ဖြိုးရေးတွက်ချက်မှုများအတွက် PHP မှဇာတိ floating point နံပါတ်များကိုအသုံးပြုခြင်းကိုရှောင်ရှားရန်အရေးကြီးသည်။ တိကျမှန်ကန်မှုကိုတိကျမှန်ကန်စွာလိုအပ်သည့်နေရာများတွင် BCMath တိုးချဲ့မှုကိုအသုံးပြုရန်အကြံပြုသည်။