2016-01-14 76 views
3

爲什麼小數沒有適當的排序:爲什麼這個usort()函數不能正確地對小數進行排序?

13 
11 
14 
10 
12.5 
--------------------------------------------------------- 
descending order: 
14 
12.5 
13 
11 
10 

與此代碼:

class Customer { 
    public $score; 
    public function __construct($score) { 
     $this->score = $score; 
    } 
} 

$customers = []; 
$customers[] = new Customer(13); 
$customers[] = new Customer(11); 
$customers[] = new Customer(14); 
$customers[] = new Customer(10); 
$customers[] = new Customer(12.5); 

if(is_array($customers) && count($customers) > 0) 
{ 
    foreach($customers as $customer) 
    { 
     echo '<div>'.$customer->score.'</div>'; 
    } 
} 

echo '<hr/>'; 
echo '<div>descending order:</div>'; 
usort($customers, function($a, $b) { 
    return $b->score - $a->score; 
}); 


if(is_array($customers) && count($customers) > 0) 
{ 
    foreach($customers as $customer) 
    { 
     echo '<div>'.$customer->score.'</div>'; 
    } 
} 
+1

http://stackoverflow.com/questions/16520000/usort-issue-with-decimal-numbers – Kivylius

回答

4

鑄造小數0.5整數它變成0。改變你的usort功能:

usort($customers, function($a, $b) { 
    if($b->score - $a->score >= 0){ 
     return 1; 
    } 
    return -1; 
}); 

輸出:

descending order: 
14 
13 
12.5 
11 
10 

PHP手冊說:

注意:從比較函數返回非整數值, 如float ,將導致內部轉換爲 回調的返回值的整數。因此,0.99和0.1等值都將被轉換爲0的整數值 ,這將比較諸如 等值的值。

+0

如果您已經在運行PHP7,則可以利用新的「太空船」運算符並進行回調'返回$ b->得分<=> $ a->得分;' –

+0

usort()應該能夠返回** THREE **值。 <0, 0, or > 0.你沒有返回0(等於),只是大於/小於。 –

0

嘗試

usort($customers, function($a, $b) { 
    return strnatcmp($b->score,$a->score); 
}); 
0
usort($customers, function($a, $b) { 
    return (int)$b->score - (int)$a->score; 
}); 

例如您輸入14.9,1414.5和輸出14.9,1414.5,它會被視爲,14.9=14,14.0=1414.5=14

相關問題