Número de arredondamento de Javascript para o 0,5 mais próximo

92


Alguém pode me dar uma idéia de como posso arredondar um número para o 0,5 mais próximo.
Eu tenho que dimensionar os elementos em uma página da web de acordo com a resolução da tela e, para isso, só posso atribuir o tamanho da fonte em pontos a 1, 1,5 ou 2 e assim por diante, etc.

Se eu arredondar, ele arredondará para 1 casa decimal ou nenhuma. Como posso realizar este trabalho?

Johnydep
fonte

Respostas:

181

Escreva sua própria função que multiplica por 2, arredonda e depois divide por 2, por exemplo

function roundHalf(num) {
    return Math.round(num*2)/2;
}
Newtron
fonte
Só usei isso para limpar uma função de redução em valores monetários que estava voltando com 9 pontos decimais ... (num * 100) / 100 funcionou perfeitamente.
Dustin Kreidler
Se você quiser terminar com 13,0 ou 13,5, combinei sua resposta com a seguinte: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D
arredondar o num * 2 não está funcionando para todos os casos ... tente qualquer decimal como 15,27 => usando sua fórmula dará => 15 onde na verdade deveria ter retornado 15,5. **** Acho que usar toFixed será melhor (num * 2) .toFixed () / 2
bomba sfdx
81

Aqui está uma solução mais genérica que pode ser útil para você:

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

Michael Deal
fonte
1
O que isso invsignifica? O que a invvariável representa?
Deilan,
1
@Deilan, eu acho inverse.
Alex K
2

Math.round(-0.5)retorna 0 , mas deve ser -1 de acordo com as regras matemáticas.

Mais informações: Math.round () e Number.prototype.toFixed ()

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}
Julia Savinkova
fonte
1
@Yuri Para expandir o que você está dizendo, roundarredonda para o próximo inteiro maior do que o valor fornecido, que em termos de números negativos seria em direção ao espectro de inteiro positivo. -2,5 iria para -2. Isso é correto?
Danny Bullis
Sim, acabou de verificar. Math.ceil(-1.75) == -1e Math.floor(-1.75) == -2. Portanto, para qualquer um que se deixe enganar por isso, pense nisso como ceilretorna um número maior que , floorretorna um número menor que .
Danny Bullis
2

Para estender a resposta principal por newtron para arredondamento em mais de apenas 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
Ronan Stoffers
fonte
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
    }

Eu escrevi isso antes de ver a melhor resposta de Tunaki;)

mekdigital
fonte
0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );
Blazes
fonte
3
se f = 1,9, isso resultará em v = 1, o que é incorreto.
bogatyrjov