当尝试用两个小数显示数字时,number_format和sprintf出现意外结果


Unexpected result for number_format and sprintf when trying to display number with two decimals

我有一个计算,返回这个double: 6.4971508379888。如果我将它转换为float并回显它,它是相同的数字。我想显示(而不是四舍五入)只有两个小数的数字,所以我尝试:

number_format((float)$number, 2, '.', '')

sprintf('%0.2f', (float)$number)

,但在这两种情况下我看到6.50而不是6.49。为什么会发生这种情况?

PHP根据给定的精度自动舍入值

如果你想要你预期的结果,那么按照下面的代码。

$precision = 2;
$number = floor($number * pow(10,$precision))/pow(10,$precision);
echo number_format((float)$number, $precision, '.', '');

这是对可接受的答案的轻微修改,因为所提供的解决方案没有给出准确的结果。它导致最后一位数字被舍入(向下)。

$digits = 2;
$number = floor($number * pow(10, ($digits + 1)) / pow(10, ($digits + 1));
echo number_format($number, $digits, '.', '');

同样,当将数字传递给number_format()时,不需要将其类型转换为浮点数。计算(和函数本身)将自动设置相应的类型。