为什么在使用json_encode时PHP将我的数字四舍五入?

时间:2018-10-10 08:11:27

标签: php json

我需要执行json_encode()并将我的原始号码转换为:

50610101800060384093800100001010000000056199999999

"50610101800060384093800100001010000000056199999999" 

但它返回

5.061010180006E+49

我尝试过:

ini_set('precision', 30); //With 1, 30, 50, 100, 1000
ini_set('serialize_precision', -1);
'content' => json_encode($params, JSON_NUMERIC_CHECK)

但不起作用。你能帮我吗?

2 个答案:

答案 0 :(得分:2)

50610101800060384093800100001010000000056199999999超出了PHP中最大整数的值,因此将其提升为浮点数并以科学计数法表示。如手册warning about floating point precision中所述,浮动结果可能由于各种原因而有问题。

如果希望将值表示为整数,则必须将其封装在字符串中。您可以在该字符串上添加零,但以科学计数法表示的结果将引用浮点数,如下所示:

<?php

$s = "50610101800060384093800100001010000000056199999999";

echo $s,"\n";

$x = $s + 0;

echo $x, "\n",is_float($x); 

请参见here

有关PHP和float的更多信息,请参见here

另一方面,如果有一个数字数组,其数字与OP帖子中的数字显示相对应,则可以编写如下代码:

<?php
    $a = [5,0,6,1,0,1,0,1,8,0,0,0,6,0,3,8,4,0,9,3,8,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,5,6,1,9,9,9,9,9,9,9,9];
    foreach($a as $e) {
       $e = (string) $e;
    }
    $foo = join($a);
    var_dump($foo);
    $foo = bcadd($foo, 1);
    var_dump($foo);

请参见live code

此示例起作用的原因是因为每个数组值都转换为数字字符串,然后将各个元素连接起来以形成一个很长的数字字符串。 BC Math是PHP中的扩展,支持任意精度。在这种情况下,bcadd()函数将一加到数字字符串上,从而显示递增的数字字符串值。

答案 1 :(得分:1)

尝试[[https://3v4l.org/biNJG][1]

如果要此输出"50610101800060384093800100001010000000056199999999" 您可能想使用json_encode将值编码为JSON后,将该值作为字符串传递 整数数据类型是介于-2,147,483,648和2,147,483,647之间的非十进制数字。

整数规则:

  1. 整数必须至少包含一位数字

  2. 一个整数不能有小数点

  3. 一个整数可以是正数或负数

  4. 整数可以三种格式指定:十进制(从10开始),十六进制(从16开始-带有0x前缀)或八进制(从8开始-带有0前缀)