Как я могу изменить правила округления чисел в JavaScript? - PullRequest
0 голосов
/ 06 сентября 2018

Результаты использования метода toFixed (2) в JavaScript следующие:

3,123 = 3,12
3,124 = 3,12
3,125 = 3,13
3,126 = 3,13 

Это, конечно, правильно, но я хочу изменить правило округления (увеличения) числа, когда 5 чисел происходит после запятой. Поэтому я хочу следующий результат:

3,123 = 3,12
3,124 = 3,12
**3,125 = 3,12** (don't increase the number)
3,126 = 3,13

Как мне добиться этого в JavaScript?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

function customRoundUp(numbers) {
  // Stringify the numbers so we can work on the strings
  const stringified = numbers.map(x => x.toString());

  return stringified.map((x) => {
    // Look if we match your special case of 5
    // If we don't, use the regular toFixed()
    if (x[x.length - 1] !== '5') {
      return parseFloat(x).toFixed(2);
    }

    // If we do, remove the 5 from the equation and round it up
    // So it will round it up low instead of high
    return parseFloat(x.substring(0, x.length - 1)).toFixed(2);
  });
}

const numbers = [
  3.123,
  3.124,
  3.125,
  3.126,
];

console.log(customRoundUp(numbers));

Реорганизованная версия

function customRoundUp(numbers) {
  return numbers.map((x) => {
    const str = String(x);
    
    if (str[str.length - 1] !== '5') return x.toFixed(2);
    
    return parseFloat(str.substring(0, str.length - 1)).toFixed(2);
  });
}

console.log(customRoundUp([
  3.123,
  3.124,
  3.125,
  3.126,
]));
0 голосов
/ 06 сентября 2018

Для тех, кто не любит parseInt:

function customRound(number, numDecimal)
{
    var x = number - 1/Math.pow(10, numDecimal + 1);
    return x.toFixed(numDecimal);
}

Идея состоит в том, чтобы уменьшить 0,001 от числа, которое вы хотите округлить (в случае toFixed (2))

Но я написал функцию для более общего использования, поэтому она выглядит сложной. Если вы хотите использовать только для .toFixed (2), то customRound можно записать так:

function customRound(number)
{
    var x = number - 0.001;
    return x.toFixed(2);
}
0 голосов
/ 06 сентября 2018

Для этого вы можете просто использовать базовую математику и анализ:

parseInt(number * 100, 10) / 100; //10 param is optional

Для каждой точности добавьте один десятичный шаг.

...