【问题标题】:PHP http_build_query loss of float precisionPHP http_build_query 丢失浮点精度
【发布时间】:2022-01-05 02:52:53
【问题描述】:

正如标题所说,当我将数组放入http_build_query() 时,所有浮点类型最终都会丢失精度。例如:

$arr = ['test' => 22854.94878205978 ];
print_r($arr);                   // prints 22854.94878205978
print_r(http_build_query($arr)); // prints 22854.94878206

我不确定为什么。我在 PHP 文档中找不到任何会导致此问题的内容。我的主要关注点只是通过 PHP 使用 cURL 通过 POST 请求发送一些数据,即。

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST");
curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($arr));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$result = curl_exec($ch);

既然我需要精确度,我该怎么办?为什么会这样?

【问题讨论】:

  • “既然我需要精度,我能做什么”...使用字符串
  • 或者在你的系统中明确设置精度?
  • @mickmackusa 的变量是什么?也许我的谷歌搜索技能没有达到标准,但我还没有找到可以明确设置精度的地方?
  • 如果您ini_set() 会发生什么?喜欢这里:stackoverflow.com/a/62996915/2943403 有什么变化吗?如果没有,请按照 Phil 的建议将浮点数转换为字符串。
  • @mickmackusa 谢谢。我已经尝试过了,但最终遇到了一个新问题。垃圾值最终被插入:即。 22854.94878205977800004084

标签: php http curl


【解决方案1】:

你有三个选择

  • 使用字符串来保存浮点数。
  • 通过ini_set('precision', <precision>);设置更高的精度。
  • 您可以将浮点数拆分为两个整数部分。

请注意,浮点数(和整数,但它们在最小值中只有最大值)不能在不损失精度的情况下保存非常小的数字(在点之后;查看 IEEE 754 标准)。

The size of a float is platform-dependent, although a maximum of approximately 1.8e308 with a precision of roughly 14 decimal digits is a common value (the 64 bit IEEE format).

为什么会这样

PHP 使用precision ini-setting 来确定所需的浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2013-08-20
    • 1970-01-01
    • 2012-09-10
    • 2014-09-28
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多