округлить до ближайшего .25 JavaScript - PullRequest
24 голосов
/ 12 октября 2009

Я хочу преобразовать все числа в ближайшие .25

Итак ...

5 becomes 5.00
2.25 becomes 2.25
4 becomes 4.00
3.5 becomes 3.50

Спасибо

Ответы [ 8 ]

87 голосов
/ 12 октября 2009

Вот реализация того, что сказал rslite:

var number = 5.12345;
number = (Math.round(number * 4) / 4).toFixed(2);
63 голосов
/ 12 октября 2009

Умножьте на 4, округлите до целого числа, разделите на 4 и отформатируйте с двумя десятичными знаками.

Редактировать Есть ли причины для снижения голосов? По крайней мере, оставьте комментарий, чтобы знать, что должно быть улучшено.

12 голосов
/ 01 марта 2013

Если вам важна скорость, учтите, что вы можете получить около 30% улучшения скорости, используя:

var nearest = 4;
var rounded = number + nearest/2 - (number+nearest/2) % nearest;

С моего сайта: http://phrogz.net/round-to-nearest-via-modulus-division
Тесты производительности здесь: http://jsperf.com/round-to-nearest

9 голосов
/ 09 января 2015

Вот общая функция для округления. В приведенных выше примерах 4 использовалось, потому что это обратное значение .25. Эта функция позволяет пользователю игнорировать эту деталь. В настоящее время он не поддерживает заданную точность, но его легко добавить.

function roundToNearest(numToRound, numToRoundTo) {
    numToRoundTo = 1 / (numToRoundTo);

    return Math.round(numToRound * numToRoundTo) / numToRoundTo;
}
4 голосов
/ 20 марта 2014

Вот ответ @ Gumbo в виде функции:

var roundNearQtr = function(number) {
  return (Math.round(number * 4) / 4).toFixed(2);
};

Теперь вы можете совершать звонки:

roundNearQtr(5.12345); // 5.00
roundNearQtr(3.23); // 3.25
roundNearQtr(3.13); // 3.25
roundNearQtr(3.1247); // 3.00
1 голос
/ 25 апреля 2017
function roundToInc(num, inc) {
    const diff = num % inc;
    return diff>inc/2?(num-diff+inc):num-diff;
}

> roundToInc(233223.2342343, 0.01)
233223.23
> roundToInc(505, 5)
505
> roundToInc(507, 5)
505
> roundToInc(508, 5)
510
0 голосов
/ 19 марта 2017

Используйте функцию ниже, надеюсь, это поможет

function roundByQuarter(value) {
    var inv = 1.0 / 0.25;
    return Math.round(value * inv) / inv;
}

Вызов функции, как показано ниже, приведет к ближайшему значению Quarter, то есть он не вернет .32, .89, .56, но вернет только .25, .75, .50 десятичных дробей.

roundByQuarter(2.74) = 2.75

roundByQuarter(2.34) = 2.25

roundByQuarter(2.94) = 3.00

roundByQuarter(2.24) = 2.25
0 голосов
/ 11 сентября 2013

Очень хорошее приближение для округления:

function Rounding (number, precision){

  var newNumber;
  var sNumber = number.toString();

  var increase = precision + sNumber.length - sNumber.indexOf('.') + 1;

  if (number < 0)
    newNumber = (number -  5 * Math.pow(10,-increase));
  else
  newNumber = (number +  5 * Math.pow(10,-increase));

  var multiple = Math.pow(10,precision);
  return Math.round(newNumber * multiple)/multiple;
}
...