【问题标题】:Unexpected result for number_format and sprintf when trying to display number with two decimals尝试显示带两位小数的数字时 number_format 和 sprintf 的意外结果
【发布时间】:2016-06-28 09:00:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php printf number-formatting


    【解决方案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() 时,不需要将类型转换为浮点数。计算(以及函数本身)会自动相应地设置类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2010-11-21
      • 2023-04-02
      相关资源
      最近更新 更多