为什么尾随零和前导零会导致我的函数返回我不想要的值?

时间:2019-05-17 00:49:21

标签: javascript function

我提供的这组代码应使用我输入的任意数字并将其取反。当前,该函数在n = 21.365或n = 5698时起作用,但是当n = 0456456456时,它返回41422397而不是6546546540;或者当n = 056985时,它返回58965而不是589650;在n = 016540时,它返回257而不是45610。

这是我到目前为止所写的

//rules & limitations
//negative numbers should remain negative
//leading zeros should be removed
//the function can accept floats or integers
//the function will return integers as integers

function reverseNumberWithBuiltInFunctions(n) {
    return (
        parseFloat (
            n
            //convert the number to a string
            .toString()
            //convert to array of characters
            .split('')
            //reverse array of characters
            .reverse()
            //join reversed array of characters
            .join('')
        ) * Math.sign(n)
    )
}

我想如果n = 001,则返回100;或者,如果n = 0456456456,则返回6546546540。从本质上来说,当前导或尾随零或两者都包含在“ n”中时,我会遇到麻烦,或者当数字存在某种模式时,似乎会出现问题。

还有,为什么当n = 016540时返回257?

您是否知道有任何解决方案可以通过给定的规则和限制来帮助改进功能的逻辑,从而产生预期的结果?

2 个答案:

答案 0 :(得分:5)

如果输入是整数或浮点数,那么您想要的是不可能的。整数或浮点数都没有“前导零”之类的东西。如果您使用前导零创建整数文字,它将变成八进制文字(更改值;这就是n = 0456456456的行为方式,0456456456只是拼写{{1}的八进制方式}。如果您使用前导零分析字符串以形成整数,则它们将被忽略(79322414parseInt('000123')产生相同的值,即值parseInt('123'))。这就是为什么123变成016540的原因:八进制字面量等于十进制字面量257,并且将其反转并解析回整数将忽略前导7520,而留下{{1 }}。

您不能保留这样的前导零,因为它们不存在于字符串形式之外。而且您会在反转中丢失尾随零,因为它们以新形式变为前零。

要么只使用字符串,要么接受您将丢失前导零。

我会注意到您在注释中的规则指定:

0

所以它在这里按预期工作。

答案 1 :(得分:1)

您必须将其作为字符串传递,因为数字中的前导0不会这样解释。

例如:

// Will always be evaluated as 1
let foo = 001;
console.log(foo);

如果要以n的形式提供string,则可以这样操作:

reverseNumberWithBuiltInFunctions = n => parseFloat(n.toString().split('').reverse().join(''));

console.log(reverseNumberWithBuiltInFunctions('0456456456'))
console.log(reverseNumberWithBuiltInFunctions('056985'))