Nombre d'arrondi Javascript à 0,5 près


96


Quelqu'un peut-il me donner une idée de la façon d'arrondir un nombre à 0,5 près.
Je dois mettre à l'échelle les éléments d'une page Web en fonction de la résolution de l'écran et pour cela, je ne peux attribuer la taille de la police en pts qu'à 1, 1,5 ou 2 et plus, etc.

Si j'arrondis, il est arrondi à 1 décimale ou à aucune. Comment puis-je accomplir ce travail?

Réponses:


187

Écrivez votre propre fonction qui multiplie par 2, arrondit, puis divise par 2, par exemple

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

Je viens de l'utiliser pour nettoyer une fonction de réduction sur les valeurs monétaires qui revenait avec 9 points décimaux ... (num * 100) / 100 fonctionnait parfaitement.
Dustin Kreidler le

Si vous voulez finir avec 13,0 ou 13,5, j'ai combiné votre réponse avec celle ci-dessous: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

arrondir le nombre * 2 ne fonctionne pas pour tous les cas .. essayez une décimale comme 15.27 => en utilisant votre formule donnera => 15 où en fait il aurait dû renvoyer 15,5. **** Je pense que l'utilisation de toFixed sera meilleure (num * 2) .toFixed () / 2
bombe sfdx

@sfdxbomb Avez-vous vérifié cela? Dans la console de mon navigateur roundHalf(15.27)renvoie 15,5
malarres

81

Voici une solution plus générique qui peut vous être utile:

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
Que veut invdire? Que invreprésente la variable?
Deilan

1
@Deilan je suppose inverse.
Alex K

2

Math.round(-0.5)renvoie 0 , mais il doit être -1 selon les règles mathématiques.

Plus d'informations: Math.round () et Number.prototype.toFixed ()

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

1
@Yuri Pour développer ce que vous dites, roundarrondit au prochain entier supérieur à la valeur donnée, ce qui en termes de nombres négatifs serait vers le spectre entier positif. -2,5 irait à -2. Est-ce exact?
Danny Bullis

Ouais vient de vérifier. Math.ceil(-1.75) == -1et Math.floor(-1.75) == -2. Donc, pour quiconque se fait trébucher par cela, pensez simplement qu'il ceilrenvoie un nombre supérieur à , floorrenvoie un nombre inférieur à .
Danny Bullis

2

Pour étendre la réponse du haut par newtron pour arrondir sur plus de seulement 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
    }

J'ai écrit ceci avant de voir la meilleure réponse de Tunaki;)


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

3
si f = 1,9, cela entraînera v = 1, ce qui est incorrect.
bogatyrjov
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.