【问题标题】:Function passing parameters [duplicate]函数传递参数
【发布时间】:2015-06-08 16:11:34
【问题描述】:

这是一个小的 JavaScript。我从函数中得到了意想不到的结果。 020*2 给出 32 而不是 40。有人知道如何解决这个问题吗?

function myFunction(a, b) {
  return a * b;
}

document.write('04 * 03 = ');
document.write(myFunction(04, 03)); //Result 12, correct
document.write('  <<  Correct <br/>020 * 02 = ');
document.write(myFunction(020, 02)); //Result 32, wrong - expected result 40
document.write('  <<  Expected 40 here');

【问题讨论】:

  • 020 是八进制 20。也就是 16。
  • 这是因为以 0 开头的数字被视为八进制:stackoverflow.com/questions/12888075/…
  • @Jonathan.Brink 任何以零开头且没有任何 8 或 9 的数字。 08 == 8
  • @JuanMendes 感谢您的澄清

标签: javascript


【解决方案1】:
  • 020 八进制 => 16 十进制
  • 02 八进制 => 2 十进制

16 * 2 = 32。


示例

将八进制值转换为以 8 为底(八进制)的字符串,然后以 10 为底(十进制)对其进行解析。

var x = 020;                                                  // 16 (octal)
var y = 02;                                                   // 2  (octal)

document.body.innerHTML = x + ' x ' + y + ' = ' + x * y;      // 32

document.body.innerHTML += '<br />';                          // {Separator}

var x2 = parseInt(x.toString(8), 10);                         // 20 (decimal)
var y2 = parseInt(y.toString(8), 10);                         // 2  (decimal)

document.body.innerHTML += x2 + ' x ' + y2 + ' = ' + x2 * y2; // 40

【讨论】:

  • 这样做的目的是什么?八进制将提供什么用途? 08 === 010 //true!?
  • @KJPrice 08 不是八进制数。它被视为小数。和十六进制的用法一样:)
【解决方案2】:

如 cmets 中所述,在数字前加零会将其类型从十进制 (1 - 10) 更改为八进制 (1 - 8)。要保持数字为小数,请删除前导零。

这是您的代码与此建议:

function myFunction(a, b) {
    return a * b;
}

document.write('04 * 03 = ');
document.write(myFunction(4, 3));     //Result 12, correct
document.write('  <<  Correct <br/>20 * 2 = ');
document.write(myFunction(20, 2));     //Result 40, correct
document.write('  <<  Correct ')

myFunction(04, 03) 工作正常的原因是它在八位中没有数字。另一方面,20 * 0220 的八位中有一个2,当它乘以八进制02 时,它被解释为八的2 倍或16。

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2021-04-13
    • 2015-10-22
    • 2014-01-24
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多