为什么$ variable = 0759给出61?

时间:2014-02-26 12:04:47

标签: php variables

我不知道如何谷歌这个,所以我在这里问。当我宣布变量$something = 0759变成61时,为什么会发生这种情况。我知道答案必须非常简单,所以请原谅我的愚蠢。

5 个答案:

答案 0 :(得分:14)

它是一个Integer字面值,您声明一个带前导零的八进制数字。

$something = 0759; // octal

八进制数字系统是base-8数字系统。 您只能使用0-7之间的数字(其他数字将被丢弃)。

$a = 0759; 
$b = 075;
var_dump($a==$b);
// bool(true)

http://www.php.net/manual/en/language.types.integer.php

您可以使用ltrim跳过零。

 $a = ltrim("0759", 0); 
 echo $a; // 759
 // and reformat as suggested with str_pad or printf
 echo str_pad($a, 4, "0", STR_PAD_LEFT);

答案 1 :(得分:9)

为什么会发生

在PHP(和大多数编程语言)中,0前面的数字被视为octal number。它是一个基数为8的数字系统,数字为1-7。

Octal 0759相当于八进制075(9被丢弃,因为八进制系统中没有9)。八进制075相当于十进制61. PHP实际上将数字存储为八进制,但是当使用print / echo输出时,它总是以十进制表示,因此075变为61.

转换

请参阅Octal to Decimal conversion上的维基百科。但这应该给你一个基本的想法:

(075) 8 =(0 x 8 ^ 2)+(7 x 8 ^ 1)+(5 x 8 ^ 0)
(075) 8 = 0 + 56 + 5
(075) 8 = 61

基本上:

7 * 8 = 56
5 * 1 =  5
       ====
        61

如何解决此问题

只需将数字存储为整数/字符串,然后将其格式化为输出。

使用sprintf()

echo sprintf('%04d', $number); // 0759

使用str_pad()

echo str_pad($number, 4, '0', STR_PAD_LEFT); // 0759

如果你真的想保留前导零,那么将它存储为字符串:

$number = '0759';

答案 2 :(得分:2)

PHP编译器可以将以0开头的数字视为八进制数字表示法。

您可以在此处找到更多详细信息: Use numbers starting with 0 in a variable in php

答案 3 :(得分:1)

当你为一个以0开头的变量赋值时,假设它是八进制,在你的情况下(0759)9不是八进制数,因此被忽略,75八进制转换为十进制是61。

答案 4 :(得分:1)

从0开始的数字是八进制,但是在八进制中你可以使用0-7而不是9,所以0759将转换为075和八进制中的075是十进制的61