为什么这个 usort() 函数不能正确排序小数?

Why can this usort() function not properly sort decimals?

为什么小数排序不正确:

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>';
    }
}

将小数 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 手册说:

Caution: Returning non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.

尝试

usort($customers, function($a, $b) {
    return strnatcmp($b->score,$a->score);
});
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