【问题标题】:Why does JavaScript output 16384 instead of 040000? [duplicate]为什么 JavaScript 输出 16384 而不是 040000? [复制]
【发布时间】:2014-01-10 12:46:40
【问题描述】:

我的 JavaScript 程序遇到了一个非常奇怪的问题。我发现 JavaScript 出于某种原因将 040000 更改为 16384! [Example] 有谁知道 JavaScript 为什么要这样做?

【问题讨论】:

  • 如果你真的需要用零填充一个数字,请尝试使用字符串。

标签: javascript numbers


【解决方案1】:

这是因为在 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 )。

干杯

【讨论】:

  • 这是可视化八进制的好方法。谢谢。
  • 为什么是八进制? base4base2 (binary) 不是更现实吗?有什么办法可以避免这种情况吗?
  • @Progo:为什么你一开始会有领先的0?是来自用户输入,还是来自服务器端变量?
  • 如果你的值原本是一个字符串,你可以使用parseInt('040000', 10)。如果是040000作为整数,就不是40000,是16384。前导零就是八进制。
  • @Scopey,我在您的评论 xD 的同时添加了这一点。没错:)
【解决方案2】:

因为 javascript 认为它是 OCTAL 格式

解释:-

Javascript(像大多数编程语言一样)允许我们直接使用octalhexadecimal 数字,我们所需要的只是在指定数字时告诉我们使用的是哪个数字基数。为了识别octalhexadecimal 数字,我们使用这些碱基在数字前面添加一些东西来指示我们使用的是哪个碱基。数字前面的0 表示后面的数字是八进制,而前面的0x 表示十六进制数字。因此,十进制数18 也可以表示为022octal)和0x12hexadecimal)。我们不会在十进制数字的前面放置特殊符号,因此任何不以00x 开头的数字都被假定为十进制。

所以你的情况也一样

040000(base8)=16384(base10)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多