PHP json_encode字符串到大浮点数

f45qwnt8  于 2023-01-03  发布在  PHP
关注(0)|答案(1)|浏览(125)

由于PHP的浮点数大小有限制(最大14位),我使用字符串来处理大的浮点数,在我的情况下,我有19位真实的和2位精度,我需要一个解决方案来JSON编码一个包含这些数字的数组,但也可以将它们从字符串类型转换为浮点类型。
使用JSON_NUMERIC_CHECK标志不会有帮助,因为数字太大

<?php
$array = array(
"big_float1" => "9876543210999999999.01",
"big_float2" => "9876543210999999999.01",
"float1" => 2.2
);

$json = json_encode($array,JSON_NUMERIC_CHECK);
?>

在上面的代码中,我需要这样的JSON对象{"big_float1" : 9876543210999999999.01, "big_float2" : 9876543210999999999.01, "float1" : 2.2}

pgx2nnw8

pgx2nnw81#

因为字符串到浮点数的转换需要PHP来完成,所以这是不可能的。64位PHP的最大整数值是9223372036854775807,这比你需要的要小。你可以尝试以下几种解决方法:

  • 如果系统可以处理这么大的数字,我会将值作为字符串发送,然后在接收端解码并强制转换为float
  • 将数字分为3个部分:(1)在另一个字段中将小数部分作为整数发送;(2)通过在预定位置拆分字符串将整数部分拆分为2部分。如果您决定在第5个位置这样做,那么您将得到9999998765432109999。在接收端,您可以通过first_part * 10^5 + second_part重新创建原始数字
  • 如果能去掉小数部分,就能扩展整数的空间(并将其发送到另一个字段中),并且只处理整数部分的正值。在这种情况下,当您的代码计算值时,您可以从PHP_INT_MIN + value1 + value2 + value4...开始。这样您将可以使用整个2^64空间(小于2^63的值为负数)。唯一的办法是在接收端加上2^64和小数部分。
  • 如果你不能改变接收端解码消息的方式,你唯一的办法是使用一个目标语言的子系统,它可以处理这么大的数字,并使用它来发送消息。你的处理将由PHP完成,并保存到磁盘,发送到一个端口或进行一个系统调用,在那里小脚本将处理生成的消息并发送它。

相关问题