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


96


Хтось може дати мені уявлення, як я можу округлити число з точністю до 0,5.
Мені потрібно масштабувати елементи на веб-сторінці відповідно до роздільної здатності екрану, і для цього я можу призначити лише розмір шрифту в балах до 1, 1,5 або 2 і далі тощо.

Якщо я округлюю, його округлюється до 1 знака після коми або до жодного. Як я можу виконати цю роботу?

Відповіді:


187

Напишіть власну функцію, яка множиться на 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); }
Ден Д

округлення числа * 2 не працює для всіх випадків .. спробуйте будь-який десятковий знак, такий як 15.27 => за допомогою вашої формули дасть => 15, де насправді він повинен був повернути 15.5. **** Я думаю, що використання toFixed буде кращим (num * 2) .toFixed () / 2
sfdx bomb

@sfdxbomb Ви перевірили це? У консолі мого браузера roundHalf(15.27)повертається 15,5
malarres

81

Ось більш загальне рішення, яке може бути вам корисним:

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змінна?
Дейлан,

1
@Deilan я б здогадався inverse.
Alex K

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. Це правильно?
Danny Bullis

Так просто перевірено. Math.ceil(-1.75) == -1і Math.floor(-1.75) == -2. Тож для тих, кого це спотикає, просто думайте про це, як ceilповертає більше, ніж число, floorповертає менше, ніж число.
Danny Bullis

2

Розширити верхню відповідь за допомогою 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

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
    }

Я писав це до того, як побачив кращу реакцію Тунакі;)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.