PHP随机将大整数减1

标签 php mysql json

<分区>

我偶然发现了一个奇怪的错误/问题。

我有一个 MySQL 表,其中有一列用数字 (BIGINT) 填充。这些数字对于常规的 32 位整数来说太大了,因此 PHP 会将它们转换为 32 位的字符串。这每次都会给出正确的结果。

当在 64 位 PHP 上运行并且不使用 $variable = (string)$variable 强制转换为字符串时,结果有时会减 1,例如像 1293203059233 这样的数字变成了 1293203059232。这显然不好。奇怪的是我看不到任何模式。

MySQL 中的一行有时递减有时不递减并不是随机发生的,而是相同的整数/行总是递减,并且总是递减 1。

什么会导致这种情况?我使用 json_encodestdClass 对象或 arrays() 转换为文本,然后通过常规 HTTP 响应发送它们。

mysqli 使用准备好的语句检索行,例如:

$stmt = $sql->prepare->("SELECT BIGNUMBER FROM table WHERE SOMEID = ?");
$stmt->bind_result($bignumber);
$stmt->bind_param("i",$someid);
$stmt->execute();
$stmt->fetch();
$stmt->close();

$obj = new stdClass();
$obj->number = $bignumber;

echo json_encode($obj);

我在浏览数据库表时验证了所有的整数都是正确的。

一些示例(这些是实际值):

不转换为字符串:

10205160559939609 -> 10205160669939608 // bad

与:

10205160559939609 -> "10205160559939609" // good

不转换为字符串:

10154493437278508 -> 10154493437278508 // good (?)

与:

10154493437278508 -> "10154493437278508" // good

编辑:我在 json_encode 之前做了一个 error_log 测试来测试,产生:

as Strng: (used error_log((string)$number);)
10205160559939609
as int: (used error_log($number);)
10205160559939609

这表明 php 确实获得了正确的值,并且错误发生在 php json_encode 或浏览器的解码方法中。

最佳答案

只需在 chrome 控制台中输入 10205150669939609 即可打印出数字 10205150669939608(四舍五入效果)。我猜这么大的整数在 JS 中是无效的,所以它们也不应该在 JSON 中。如果我有那么大的值,我会使用字符串。

关于PHP随机将大整数减1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32969168/

相关文章:

mysql - 如何使用触发器为非主键列添加自动增量

php - 在 mySQL 或 PHP 数组中对结果进行排序?

python - 在 python3 中解析嵌套 json/列表时出现问题?

php - Mysql 通过 Group by 进行限制

php - 如何从 CSS 列表样式 :decimal 中删除点 '.'

php - ElasticSearch:在多个字段上查询

java - 为什么 Spring Boot 返回一个字符串而不是 JSON

PHP - 根据正则表达式生成字符串

mysql - SQL 百分比 SUM 不同于 100

php - 处理空值和 JSON