【问题标题】:PHP - float number accuracy difference on WAMP and a web serverPHP - WAMP 和 Web 服务器上的浮点数精度差异
【发布时间】:2020-11-09 18:03:17
【问题描述】:

我知道 php 浮点数 are not accurate 并且我知道像 BCMathGMP 这样的解决方案。我在本地WAMP server 和另一台服务器(使用Nginx)上测试了以下代码:

$size = 0.0006;
$data = json_encode( array("size" => $size));
var_dump($data);

WAMP 上的输出:

string '{"size":0.0006}' (length=15)

另一台服务器上的输出:

string(31) "{"size":0.00059999999999999995}"

两台服务器上的 PHP 版本都是 7.3。为什么我在 WAMP 上得到了预期的结果,而在我的托管服务器上却出现了问题?有什么可以修复的配置吗?

【问题讨论】:

标签: php wamp floating-accuracy


【解决方案1】:

您的 WAMP 输出不是由 PHP 本身生成的,而是由 Xdebug 第三方扩展生成的。 More specifically:

Xdebug 替换了 PHP 的 var_dump() 函数来显示变量。 Xdebug 的版本包括不同类型的不同颜色和 限制数组元素/对象属性的数量, 最大深度和字符串长度。

除此之外,浮点值的隐式字符串转换的精度是configurable

$size = 0.0006;
var_dump($size);
ini_set('precision', 18);
var_dump($size);
float(0.0006)
float(0.000599999999999999947)

json_encode() 的情况下,转换是明确的,我们可以在manual 中阅读:

编码受提供的选项影响,另外浮点值的编码取决于serialize_precision 的值。

$size = 0.0006;
echo json_encode( array("size" => $size)), PHP_EOL;
ini_set('serialize_precision', 18);
echo json_encode( array("size" => $size)), PHP_EOL;
{"size":0.0006}
{"size":0.000599999999999999947}

【讨论】:

  • 这个扩展解释了输出格式的差异,但没有解释数字内容。我禁用了它,格式改变了,但值仍然正确
  • 不确定你的意思。您是否验证了两个系统中的精度设置?
  • 你的回答给了我在 phpinfo() 中搜索“精度”的线索,我发现了服务器之间的区别。就我而言,这是解决方案:ini_set('serialize_precision', -1);
  • 啊,现在我明白你的意思了。我希望我的答案是固定的。
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2012-03-14
  • 2018-02-23
  • 1970-01-01
  • 2010-12-26
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多