【问题标题】:String to integer conversion in PHP changes the valuePHP中的字符串到整数转换会改变值
【发布时间】:2016-09-28 14:07:31
【问题描述】:

所以我有这个简单的代码:

$var = abs(crc32('string - 8 characters')).rand(100,999);
var_dump($var);
echo '<br>';
var_dump((int)$var);
echo '<br>';
var_dump(intval($var));

结果:

string(13) "2047654753402"
int(2147483647)
int(2147483647) 

为什么整数值是2147483647?我希望它是2047654753402。我只想将字符串转换为整数而不更改值。

【问题讨论】:

  • 考虑到您的整数是有符号的 32 位整数.....当您的字符串值超出该范围时,您希望发生什么?甚至有一整页的 PHP 文档解释了整数溢出时会发生什么 - php.net/manual/en/language.types.integer.php
  • 如果您需要使用该大小的整数,请切换到 64 位 PHP
  • Why the integer value is 2147483647? 因为2147483647是32位有符号整数可以存储的最大值

标签: php string integer type-conversion


【解决方案1】:

您不能将大字符串数字转换为整数,因为整数有-2147483647到2147483647的限制。所以如果要将数字字符串转换为超出整数长度范围的整数,可以使用double。

$var = abs(crc32('string - 8 characters')).rand(100,999);
var_dump($var);
echo '<br>';
var_dump((double)$var)

【讨论】:

  • 如果您建议将此作为解决方案,可能值得注意的是它可能会导致一些精度损失
  • 这个解决方案有什么问题?我只是希望能够将这个长数字放入 BIGINT 列中的数据库中。这个(double) 返回一个float 数字。放到BIGINT里面会正确吗?
  • What's wrong with this solution? 问题是可能缺乏精度.....尝试运行$var = abs(crc32('string - 8 characters')).rand(100,999); var_dump($var); $var2 = (double)$var; var_dump($var2); $var3 = (string)$var2; var_dump($var3); 并查看$var3 是否与$var 相同
  • 好吧,我检查了 3 个不同的服务器,$var3 返回的结果与$var 完全相同。
  • @Qrzysio - 当值大于 PHP_INT_MAX 时不能保证......它也可能受到 php.ini 文件中的精度设置的影响
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 2013-12-16
  • 2017-04-12
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
相关资源
最近更新 更多