尝试显示带两位小数的数字时 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 的意外结果的主要内容,如果未能解决你的问题,请参考以下文章

带逗号和两位小数的数值格式

如何设置带两位小数的千位分隔符?

Java 数字格式

Dataweave 始终输出带两位小数的 JSON 数字

如何让excel饼图的百分比带两位小数

格式化带两位小数的数字var [重复]