在 PHP 中设置精度

Posted

技术标签:

【中文标题】在 PHP 中设置精度【英文标题】:Setting precision in PHP 【发布时间】:2014-05-16 19:33:38 【问题描述】:

我在运行 Windows 的笔记本电脑上安装了 php 5.5。 我正在访问 Smartsheet API,我应该得到一个 18 位(有时是 17 位)的列 id。但我得到了一个科学数字:

1.5441916385627E+15,不是1544191638562692

我在 Ubuntu 服务器环境中运行脚本,我看到 1544191638562692。同样,在 OS X Maverick 环境中运行,它与整数格式相同。

我一直在找这件事,好像是精确的。

如果我在 php 中设置,OS X Maverick 环境的精度为 14,如下所示:

<?php
ini_set('precision', 14);

    echo (float)$col->id;
    // 1.5441916385627E+15
?>

我也得到了科学数字。

谁能帮我出个主意?

【问题讨论】:

如果这是一个id,则不应将其视为数字,而应视为字符串值。 如果我不得不猜测,我会说您获得科学记数法答案的机器运行的是 32 位 PHP,而 Ubuntu 机器运行的是 64 位。如果您处理的 ID 号超过约 20 亿,则应将它们视为 CBroe 建议的字符串以实现兼容性。 【参考方案1】:

正如 cmets 中提到的,这听起来像是运行 32 位 PHP 的问题。 Smartsheet 确实提供了一些 sample PHP code 来帮助您开始使用 API。在这些示例中,文档建议您将 id 视为 32 位 PHP 中的字符串:

https://github.com/smartsheet-platform/samples/tree/master/php/1-HelloSmartsheet#dependencies

【讨论】:

【参考方案2】:

您可以在所有机器上使用 PHP 中的格式化字符串函数以相同的方式输出数字,有关文档,请参阅http://nl1.php.net/manual/en/function.sprintf.php。

因此,如果您希望将整数作为一个整体,您可以使用:

printf("%u", $number);

【讨论】:

@dpuscau 请注意,您得到的确切数字在不同的机器上仍然可能不同。见this article about floating point math【参考方案3】:

有一种可能的方法,例如,将 JSON 转换为我必须指定 JSON_BIGINT_AS_STRING 的数组:

$ColumnsArray = json_decode($data, true,515,JSON_BIGINT_AS_STRING);

【讨论】:

以上是关于在 PHP 中设置精度的主要内容,如果未能解决你的问题,请参考以下文章

hibernate中设置BigDeCimal的精度

如何在 C++ 中设置浮点变量的精度

如何在 BigQuery 架构中设置 FLOAT 的精度

如何在 C++ 中设置浮点数的精度 [重复]

警告:精度和 F 分数定义不明确,在没有预测样本的标签中设置为 0.0。使用 `zero_division` 参数

Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]