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

100


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

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

Johnydep
источник

Ответы:

194

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

function roundHalf(num) {
    return Math.round(num*2)/2;
}
ньютрон
источник
Просто использовал это, чтобы очистить функцию уменьшения денежных значений, которые возвращались с 9 десятичными точками ... (num * 100) / 100 работал отлично.
Дастин
Если вы хотите получить 13.0 или 13.5, я объединил ваш ответ с приведенным ниже: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D
округление числа * 2 не работает для всех случаев. попробуйте любое десятичное число, например 15.27 =>, используя вашу формулу, вы получите => 15, где на самом деле он должен был вернуть 15.5. **** Я думаю, что будет лучше использовать toFixed (num * 2) .toFixed () / 2
sfdx bomb
@sfdxbomb Вы это проверили? В консоли моего браузера roundHalf(15.27)возвращается значение 15.5
malarres
83

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

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

Майкл Дил
источник
1
Что invзначит? Что представляет собой invпеременная?
Deilan
1
@ Дейлан, наверное inverse.
Alex K
3

Чтобы расширить верхний ответ 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

Ронан Стофферс
источник
2

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

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

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}
Юлия Савинкова
источник
1
@Yuri Чтобы расширить то, что вы говорите, roundокругляется до следующего целого числа, большего заданного значения, что в терминах отрицательных чисел будет в сторону положительного целочисленного спектра. -2,5 пошел бы на -2. Это верно?
Дэнни Буллис
Ага только что проверил. Math.ceil(-1.75) == -1и Math.floor(-1.75) == -2. Так что для всех, кого это сбивает с толку, просто представьте, что это ceilвозвращает больше числа, floorвозвращает меньше числа.
Дэнни Буллис
2

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

Math.round(valueToRound / 0.5) * 0.5;

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

Math.round(valueToRound / step) * step;
Пол Ли
источник
1
    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
    }

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

mekdigital
источник
0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );
Blazes
источник
3
если f = 1.9, это приведет к v = 1, что неверно.
bogatyrjov 01