尝试显示带两位小数的数字时 number_format 和 sprintf 的意外结果
Posted
技术标签:
【中文标题】尝试显示带两位小数的数字时 number_format 和 sprintf 的意外结果【英文标题】:Unexpected result for number_format and sprintf when trying to display number with two decimals 【发布时间】:2016-06-28 09:00:27 【问题描述】:我有一个计算返回这个double
: 6.4971508379888。如果我将它转换为 float
并回显它,它是相同的数字。我想显示(不是四舍五入)只有两位小数的数字,所以我尝试了:
number_format((float)$number, 2, '.', '')
和
sprintf('%0.2f', (float)$number)
但在这两种情况下,我看到的是 6.50 而不是 6.49。为什么会这样?
【问题讨论】:
【参考方案1】:php 根据给定的精度自动舍入值
如果您想要您的预期结果,请遵循以下代码。
$precision = 2;
$number = floor($number * pow(10,$precision))/pow(10,$precision);
echo number_format((float)$number, $precision, '.', '');
【讨论】:
谢谢,我确实是这样解决的。我想知道为什么 number_format 和 sprintf 以这种方式工作。我刚刚发现 number_format 显然是四舍五入,但没有很好的记录。但不确定 sprintf? 这个答案给了我一些不正确的结果,比如 2401.93。它导致数字向下舍入到 2401.92。我对上面的解决方案进行了修改:$number = floor($number * pow(10, ($precision + 1))) / pow(10, ($precision + 1));
这始终给了我更准确的结果。【参考方案2】:
这是对已接受答案的轻微修改,因为提供的解决方案没有给出准确的结果。它导致最后一位数字四舍五入(向下)。
$digits = 2;
$number = floor($number * pow(10, ($digits + 1)) / pow(10, ($digits + 1));
echo number_format($number, $digits, '.', '');
此外,在将数字传递给number_format()
时,不需要将类型转换为浮点数。计算(以及函数本身)会自动相应地设置类型。
【讨论】:
以上是关于尝试显示带两位小数的数字时 number_format 和 sprintf 的意外结果的主要内容,如果未能解决你的问题,请参考以下文章