Chcę osiągnąć coś takiego w JavaScript:

input = 2455.55
f(input) = 2456
f(input) = 2460
f(input) = 2500
f(input) = 3000
f(input) = 2455.55

Na razie używam metody Math.round(), ale dzięki niej osiągam tylko 2,546. Zastanawiasz się, czy istnieje najlepszy sposób na osiągnięcie reszty.

2
Manon 1 kwiecień 2020, 16:13

3 odpowiedzi

Najlepsza odpowiedź

W oparciu o pożądane dane wyjściowe wygląda na to, że musisz śledzić liczbę wywołań funkcji. To nie wydaje się być argumentem dla twojej funkcji.

Biorąc pod uwagę ograniczenie, że masz tylko jeden argument, implementacja prawdopodobnie wygląda tak

var lastNum = 0
var digitsToRound = 0

function roundUp(input) {
  // Verify whether the function is called with the same argument as last call.
  // Note that we cannot compare floating point numbers.
  // See https://dev.to/alldanielscott/how-to-compare-numbers-correctly-in-javascript-1l4i
  if (Math.abs(input - lastNum) < Number.EPSILON) {
    // If the number of digitsToRound exceeds the number of digits in the input we want
    // to reset the number of digitsToRound. Otherwise we increase the digitsToRound.
    if (digitsToRound > (Math.log10(input) - 1)) {
      digitsToRound = 0;
    } else {
      digitsToRound = digitsToRound + 1;
    }
  } else {
    // The function was called with a new input, we reset the digitsToRound
    digitsToRound = 0;
    lastNum = input;
  }

  // Compute the factor by which we need to divide and multiply to round the input
  // as desired.
  var factor = Math.max(1, Math.pow(10, digitsToRound));
  return Math.ceil(input / factor) * factor;
}


console.log(roundUp(2455.55)); // 2456
console.log(roundUp(2455.55)); // 2460
console.log(roundUp(2455.55)); // 2500
console.log(roundUp(2455.55)); // 3000
1
Stereo 10 kwiecień 2020, 15:24

Możesz podzielić swoją liczbę przez dziesięć, aż uzyskasz liczbę niecałkowitą, zaokrąglić ją w górę, a następnie ponownie pomnożyć przez dziesięć w tym samym czasie. Coś takiego:

    function roundUp(n) {
    
        var n2 = n;
        var i=0;
        while (Number.isInteger(n2)) {
      	    n2 /= 10;
            i++;
        }
        return Math.round(n2) * Math.pow(10, i);
    
    }

    console.log(roundUp(2455.55)); // 2456
    console.log(roundUp(2456)); // 2460
    console.log(roundUp(2460)); // 2500
    console.log(roundUp(2500)); // 3000
3
Musa 1 kwiecień 2020, 13:28

Dzięki, niezłe! Zainspirowany Twoją odpowiedzią rozwiązałem to tak:

function roundNumber(num, n) {
  const divider = Math.pow(10, n);
  return Math.round(num / divider) * divider;
};
0
Manon 1 kwiecień 2020, 15:27