Javascript округления числа до ближайшего 0,5


Может кто-нибудь дать мне идею, как я могу округлить число до ближайшего 0,5.
Я должен масштабировать элементы на веб-странице в соответствии с разрешением экрана, и для этого я могу назначить только размер шрифта в пунктах 1, 1,5 или 2 и т. Д. И т. Д.

Если я округлю, то округляется либо до 1 знака после запятой, либо ни до одного. Как я могу выполнить эту работу?

10 ответов

Решение

Напишите свою собственную функцию, которая умножается на 2, округляет, а затем делит на 2, например

function roundHalf(num) {
    return Math.round(num*2)/2;
}

Вот более общее решение, которое может быть полезно для вас:

function round(value, step) {
    step || (step = 1.0);
    var inv = 1.0 / step;
    return Math.round(value * inv) / inv;
}

round(2.74, 0.1) = 2,7

round(2.74, 0.25) = 2,75

round(2.74, 0.5) = 2,5

round(2.74, 1.0) = 3,0

Просто урезанная версия всех приведенных выше ответов:

Math.round(valueToRound / 0.5) * 0.5;

Универсальный:

Math.round(valueToRound / step) * step;

Math.round(-0.5) возвращает 0, но это должно быть -1 в соответствии с математическими правилами.

Дополнительная информация: Math.round () и Number.prototype.toFixed()

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

Чтобы расширить верхний ответ Newtron для округления более чем на 0,5

function roundByNum(num, rounder) {
    var multiplier = 1/(rounder||0.5);
    return Math.round(num*multiplier)/multiplier;
}

console.log(roundByNum(74.67)); //expected output 74.5
console.log(roundByNum(74.67, 0.25)); //expected output 74.75
console.log(roundByNum(74.67, 4)); //expected output 76

Эти ответы мне не пригодились, я хотел всегда округлять до половины (чтобы рисунок с помощью svg или canvas был четким).

Это округляется до ближайшего 0,5 (со смещением, чтобы увеличиться, если в середине)

Ответ с наибольшим количеством голосов выше не подходит для:

  • roundHalf(0.6) => возвращает 0.5
  • roundHalf(15.27) => возвращает 15,5

Фиксированная выглядит следующим образом:

         const roundHalf = (num) => {
      return Math.floor(Math.ceil(num * 2) / 2)
    }
    function roundToTheHalfDollar(inputValue){
      var percentile = Math.round((Math.round(inputValue*Math.pow(10,2))/Math.pow(10,2)-parseFloat(Math.trunc(inputValue)))*100)
      var outputValue = (0.5 * (percentile >= 25 ? 1 : 0)) + (0.5 * (percentile >= 75 ? 1 : 0))
      return Math.trunc(inputValue) + outputValue
    }

Я написал это до того, как увидел лучший ответ Тунаки;)

var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );

Как немного более гибкий вариант хорошего ответа выше.

      function roundNumber(value, step = 1.0, type = 'round') {
  step || (step = 1.0);
  const inv = 1.0 / step;
  const mathFunc = 'ceil' === type ? Math.ceil : ('floor' === type ? Math.floor : Math.round);

  return mathFunc(value * inv) / inv;
}
Другие вопросы по тегам