PHP 取一个整数的十位上的数值可能出现的 bug

问:如何取到一个整数的十位上的数值?

答:先除以 10 再对 10 取余。代码如下:

echo ($number / 10) % 10;

很简单是不是?但这段代码有 bug。你可以运行下面这段代码:

echo PHP_INT_MAX;
echo PHP_EOL; // 输出换行 
echo (PHP_INT_MAX / 10) % 10;
echo PHP_EOL;

输出如下:

buggggggggggeeeeee

可以看到整数 9223372036854775807 的十位数上是 0 ,而我们确得到了 2 ,这是怎么一回事呢?

我们执行下如下代码:

$a = PHP_INT_MAX;
var_dump(gettype($a), $a);
$b = $a / 10;
var_dump(gettype($b), $b);
$c = $b % 10;
var_dump(gettype($c), $c);

输出为:

RTX截图未命名

可以看到, 9223372036854775807 不能被 10 整除,$a / 10 后得到的是一个浮点数,丢失了精度,这个时候再对 10 取模得到的值就不准了。