前言:在寫API接口的時候,小遊戲前端傳過來的數據是科學計數法字符格式的,如1.2345678987654321e+30,此時後臺處理得到數據需要進行比較排序。
1.強制性的用字段爲varchar類型進行比較排序
'CAST(`cashnum_week` AS UNSIGNED)
$list = $wx_user->field('id,user_name,head_img,cashnum_week')
->where(['status'=>1])
->order('CAST(`cashnum_week` AS UNSIGNED) DESC')
->select();
直接將字段cashnum_week 轉變爲無符號化,此時再來進行排序
2.科學計數格式轉化爲字符串
將一個科學計數格式的數:1.2345678987654321e+30 轉化爲字符串‘123456789876543210000000000000’
首先將變量進行拆分在重組得到結果
實現原理:(1)將1.2345678987654321e+30拆分爲1.2345678987654321和+30
(2)在用1.2345678987654321乘以10的30次方,10的30次方用php函數pow(10,30)來得出。
a.第一種方法,從最普通的想法來
public function sctonum($num){
if(false !== stripos($num, "e")){
$a = explode("e",strtolower($num));
$b = $a[0] * pow(10,$a[1]);
return $b;
}else{
return $num;
}
}
b.用循環來得出
public function numToStr($num)
{
$result = "";
if (stripos($num, 'e') === false) {
return $num;
}
while ($num > 0) {
$v = $num - floor($num / 10) * 10;
$num = floor($num / 10);
$result = $v . $result;
}
return $result;
}
c.全部用php函數來得出
public function sctonum($num, $double = 5){
if(false !== stripos($num, "e")){
$a = explode("e",strtolower($num));
return bcmul($a[0], bcpow(10, $a[1], $double), $double);
}else{
return $num;
}
}
//注$double 是小數位數,可默認設置爲沒有
總結及建議:一萬個人眼裏一萬個哈利波特!每個結果可以由不同的過程來實現,首先用你自己最順手的,然後再來優化,其次借鑑能理解又高效規範的方法,比如c,簡潔高效。