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