我有以下代码:
$a = 012;
echo $a/4;
echo '<br>';
echo $a+4;
echo '<br>';
echo $a;
这会生成以下输出:
2.5
14
10
但是,我希望:
3
16
12
为什么$a
以0开头时会发生这种情况?
答案 0 :(得分:1)
答案是前面的0,将数字定义为八进制(而不是正常的基数10)。请注意Integers in the PHP Documentation上的页面:
<?php
$a = 1234; // decimal number
$a = -123; // a negative number
$a = 0123; // octal number (equivalent to 83 decimal)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)
?>
所以基本上八进制是每列中数字最多为7而不是9.因此,最右边一列中的1使数字为8,最左边一列中的两个加上2,因此数字为10。
在PHP中定义的十六进制数字中,以0x
开头,它们计为15(称为基数15); A代表10,B代表11,......一直到F代表15.二进制数字(在PHP中,它们以0b
开头定义)另一方面只有1,它们只有两个每列0和1中的值。
您可以使用octdec
函数解决此问题(将八进制转换为十进制):
<?php
$a = octdec(012);
echo $a/4;
echo '<br>';
echo $a+4;
echo '<br>';
echo $a;
?>
当除法发生时,PHP执行一些type juggling并且八进制转换为整数。因此,为什么你得到你的结果。
在PHP 7之前,octals中的无效数字(如8或9)被忽略,in PHP 7 they now cause an error。
答案 1 :(得分:1)
正如@Rizier123所指定的那样,您必须遵循整数类型doc。
正如整数类型http://php.net/manual/en/language.types.integer.php
的官方文档中所述整数可以用十进制(基数10),十六进制(基数16),八进制(基数8)或二进制(基数2)表示,可选地前面带符号( - 或+)
$n = 123; // decimal number
$n = -123; // negative number
$n = 0234; // octal number
...
因此,在您的情况下,第一个数字$a = 012
表示它以八进制表示法。
当您进行除法时:$a/4
PHP继续type juggling将其转换为十进制基数并除以4
$a = 012; // 10 in decimal base
echo $a/4; // 10/4 -> 2.5
注意: 在PHP 7之前,如果在八进制整数(即8或9)中给出无效数字,则忽略该数字的其余部分
答案 2 :(得分:0)
要获得良好答案,请打开link。
012
是八进制数字。以八进制表示,数字由8个小数组成。起始编号为零。跳过剩余的2位数字12。
8^0 = 1,8^1=8 So 8+2=10
10/4 = 2.5 => $a+4 = 10 + 4 = 14;