将javascript

时间:2018-07-07 15:26:27

标签: javascript logic

我正在尝试实现一个功能,该功能可以在javascript中反转给定的数字(int / float)。功能实现是

function reverseNumber(n) {
    let reversed = 0;
    const sign = Math.sign(n)
    n *= sign;

    const exponent = n.toString().indexOf('.');
    if (exponent !== -1) n *= Math.pow(10, n.toString().length - 1 - exponent);
    while (n !== 0) {
        reversed *= 10;
        reversed += n % 10;
        n = Math.floor(n / 10);
    }
    if (exponent !== -1) reversed /= Math.pow(10, exponent);
    return reversed * sign;
}

此功能通过了以下测试案例

  expect(reverseNumber(0)).toEqual(0);
  expect(reverseNumber(15)).toEqual(51);
  expect(reverseNumber(90)).toEqual(9);
  expect(reverseNumber(-5)).toEqual(-5);
  expect(reverseNumber(-90)).toEqual(-9);
  expect(reverseNumber(-2359)).toEqual(-9532);
  expect(reverseNumber(12.403)).toEqual(304.21);
  expect(reverseNumber(-12.4)).toEqual(-4.21);

唯一失败的情况是输入为10.0。测试用例是

expect(reverseNumber(10.0)).toEqual(0.01);

我没有找到任何方法来倒退10.0 => 0.01。你们可以帮忙吗? 谢谢

2 个答案:

答案 0 :(得分:6)

由于您似乎很乐于在字符串级别工作,所以最简单的事情可能是转换为字符串,将其转换为数组,反转数组并将它们重新放在一起-同时允许减号:< / p>

function reverseNumber(num) {
    // Remember if it's negative
    var isNegative = num < 0;
    // Get the digits and decimal just for the absolute part
    var chars = (isNegative ? -num : num).toString().split("");
    // Reverse them
    chars.reverse();
    // Put it back together and convert back to a number
    var num = Number(chars.join(""));
    // Return the result, converting back to negative if appropriate
    return isNegative ? -num : num;
}

出于指示目的,这很冗长,当然,这些操作中的许多操作都可以链接在一起。

测试示例:

function reverseNumber(num) {
    // Remember if it's negative
    var isNegative = num < 0;
    // Get the digits and decimal just for the absolute part
    var chars = (isNegative ? -num : num).toString().split("");
    // Reverse them
    chars.reverse();
    // Put it back together and convert back to a number
    var num = Number(chars.join(""));
    // Return the result, converting back to negative if appropriate
    return isNegative ? -num : num;
}

function test(num, expect) {
    var result = reverseNumber(num);
    console.log(num, " => ", result, result == expect ? "OK" : "ERROR");
}

test(0, 0);
test(15, 51);
test(90, 9);
test(-5, -5);
test(-90, -9);
test(-2359, -9532);
test(12.403, 304.21);
test(-12.4, -4.21);
.as-console-wrapper {
  max-height: 100% !important;
}


重新编辑:

  

唯一失败的情况是输入为10.0。测试用例是

expect(reverseNumber(10.0)).toEqual(0.01);
     

我找不到任何方法来反转10.0 => 0.01。

如果您的起点是一个数字,那么您就不能这样做,除非不弄乱其他几个测试用例。作为一个数字,1010.0之间没有区别,因此如果10.0(即10)=> 0.01,则15 (即15.0 => 0.51)。但是您已经说过应该是51

如果您的起点是 string ,则可以这样做,但是:

function reverseNumber(numStr) {
    // Remember if it's negative
    var isNegative = numStr[0] === "-";
    // Get the digits and decimal just for the absolute part
    var chars = (isNegative ? numStr.substring(1) : numStr).split("");
    // Reverse them
    chars.reverse();
    // Put it back together and convert back to a number
    var num = Number(chars.join(""));
    // Return the result, converting back to negative if appropriate
    return String(isNegative ? -num : num);
}

function test(num, expect) {
    var result = reverseNumber(num);
    console.log(num, " => ", result, result == expect ? "OK" : "ERROR");
}

test("0", "0");
test("15", "51");
test("90", "9");
test("-5", "-5");
test("-90", "-9");
test("-2359", "-9532");
test("12.403", "304.21");
test("-12.4", "-4.21");
test("10.0", "0.01");
.as-console-wrapper {
  max-height: 100% !important;
}

答案 1 :(得分:0)

只需将值转换为字符串即可拆分并取反。

10.0不起作用的原因是因为JavaScript删除了数字中不需要的字符。 10 == 10.0 = true

如果我们回到二年级数学课程,我们知道小数点后的零将毫无意义。这与小数点前的前导零相同。 JavaScript知道这些没有意义,并删除了它们。

function reverseIt(num) {
  let neg = num < 0
  let result = num.toString().replace(/^-/, '').split('').reverse().join('')
  return parseFloat(neg ? '-' + result : result)
}

console.log(reverseIt(123))
console.log(reverseIt(10))
console.log(reverseIt(1235))
console.log(reverseIt(-5310))
console.log(reverseIt(10.0.toFixed(1)))