PHP算术运算,其中数字从零开始

时间:2015-09-30 18:21:28

标签: php

我有以下代码:

$a = 012;
echo $a/4;
echo '<br>';
echo $a+4;
echo '<br>';
echo $a;

这会生成以下输出:

2.5
14
10 

但是,我希望:

3
16
12

为什么$a以0开头时会发生这种情况?

3 个答案:

答案 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;