【发布时间】:2014-01-10 12:46:40
【问题描述】:
我的 JavaScript 程序遇到了一个非常奇怪的问题。我发现 JavaScript 出于某种原因将 040000 更改为 16384! [Example] 有谁知道 JavaScript 为什么要这样做?
【问题讨论】:
-
如果你真的需要用零填充一个数字,请尝试使用字符串。
标签: javascript numbers
我的 JavaScript 程序遇到了一个非常奇怪的问题。我发现 JavaScript 出于某种原因将 040000 更改为 16384! [Example] 有谁知道 JavaScript 为什么要这样做?
【问题讨论】:
标签: javascript numbers
这是因为在 js 中,以0 开头的数字文字被认为是八进制(以8为底)
例如
010 == 8
在您的示例中,040000 实际上是 4*8*8*8*8 = 16384,因为在八进制中,右侧的每个 0 将值乘以 8。
编辑:奖金:
如果前导 0 在字符串表示形式中,(例如,如果它是由用户引入的),并且您想避免转换为八进制,请指定基数(又名 radix)在parseInt方法调用中取值10,像这样
var number = parseInt("040000", 10); //number will be 40000 ;)
在最近的浏览器中,基数默认为 10,但在旧浏览器中不是,所以如果你也想要最大的兼容性,总是指定基数参数(通常是 10 )。
干杯
【讨论】:
base4 或 base2 (binary) 不是更现实吗?有什么办法可以避免这种情况吗?
0?是来自用户输入,还是来自服务器端变量?
parseInt('040000', 10)。如果是040000作为整数,就不是40000,是16384。前导零就是八进制。
因为 javascript 认为它是 OCTAL 格式
解释:-
Javascript(像大多数编程语言一样)允许我们直接使用octal 和hexadecimal 数字,我们所需要的只是在指定数字时告诉我们使用的是哪个数字基数。为了识别octal 和hexadecimal 数字,我们使用这些碱基在数字前面添加一些东西来指示我们使用的是哪个碱基。数字前面的0 表示后面的数字是八进制,而前面的0x 表示十六进制数字。因此,十进制数18 也可以表示为022(octal)和0x12(hexadecimal)。我们不会在十进制数字的前面放置特殊符号,因此任何不以0 或0x 开头的数字都被假定为十进制。
所以你的情况也一样
040000(base8)=16384(base10)
【讨论】: