在 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 中设置精度的主要内容,如果未能解决你的问题,请参考以下文章