【问题标题】:Printing big numbers in PHP在 PHP 中打印大数字
【发布时间】:2013-05-03 13:16:49
【问题描述】:

数字是13911392101301011,无论使用sprintf 还是number_format,我都会得到同样奇怪的结果。

sprintf('%017.0f', "13911392101301011"); // Result is 13911392101301012
number_format(13911392101301011, 0, '', ''); // Result is 13911392101301012

sprintf('%017.0f', "13911392101301013"); // Result is 13911392101301012
number_format(13911392101301013, 0, '', ''); // Result is 13911392101301012

【问题讨论】:

  • 随机想法:该数字是否被解释为floatdouble 并四舍五入到此类数据类型的最接近的有效值?注意到它太大而无法容纳 32 位整数,但它可以容纳 64 位整数,但不确定是否是。
  • 我知道这太大了,但我发现使用sprintfnumber_format 应该可以解决问题。不幸的是,在这种情况下不起作用
  • 有趣的是 13911392101301014 打印正确而 13911392101301011 打印不正确,所以这不是范围问题
  • @ØHankyPankyØ 是的,这对我来说也是最奇怪的事情。当您尝试回显13911392101301015 时,问题再次存在,结果为13911392101301016

标签: php printf number-formatting


【解决方案1】:

由于您实际上将数字作为字符串,请使用 %s 修饰符:

sprintf('%s', "13911392101301011"); // 13911392101301011

请注意,PHP 在内部使用有符号整数。大小取决于您的系统。

32位系统:

2^(32-1) = 2147483648

64位系统:

2^(64-1) = 9223372036854775808

-1 因为为标牌标志保留了 1 位。

【讨论】:

    【解决方案2】:

    由于您在这里处理大量数字,您可能希望将它们保留为字符串并使用BCMath functions 对字符串值执行数值运算。

    $val = "13911392101301011";
    
    echo $val; // 13911392101301011
    echo bcadd($val, '4'); // 13911392101301015
    echo bcmul($val, '2'); // 27822784202602022
    

    【讨论】:

      【解决方案3】:

      您可以通过这种方式轻松完成:-

      ini_set("precision",25); // change 25 to whatever number you want or need 
      $num = 13911392101301011;
      print $num;
      

      【讨论】:

      • 还是一样:13911392101301012
      • 不,我已经测试过了。它可以工作,当然 BCMath 是一个不错的选择。
      【解决方案4】:

      文档指出 $number 采用 number_format is float,因此存在显式类型转换。等效项如下所示:

      sprintf('%017.0f', (float) "13911392101301011");
      

      浮点数精确到 14 digits 左右,您的号码有 17 位数字。

      【讨论】:

        【解决方案5】:

        您的 number_format 调用正在设置 .和 , 留空

        string number_format ( float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',' )
        

        试试这个:

        number_format(13911392101301011, 0, '.', ',');
        

        【讨论】:

        • 结果是13,911,392,101,301,012
        • 这不是你想要做的吗?哦,您的问题是最后一位数字向上或向下的“四舍五入”。你用的是什么版本的PHP?
        • 错误答案。 OP 并未尝试格式化数字,而是按说明打印其值。
        • 没有朋友。当我直接回显数字时,结果是1.3911392101301E+16。使用number_format 是解决此问题的方法。
        • 在这里查看一些答案和 cmets:stackoverflow.com/questions/6936062/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 2018-08-27
        • 1970-01-01
        • 2022-10-26
        • 2011-04-30
        • 1970-01-01
        • 2013-03-06
        相关资源
        最近更新 更多