11484 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

J'ai cherché pas mal de chose déjà existante mais je ne trouve pas mon bonheur dans ce que je souhaite réaliser.
Math.round() s'en rapproche le plus, mais il me manque quelque-chose.

En gros j'ai une fonction qui fait différents calculs avec des résultats suivants :

6,75
7,5
8,25
9
9,75
10,5
11,2
12,6
14
15,4
16,8
18,2
etc...

Ce que je souhaite obtenir (Math.round le fait bien) arrondir à l'entier le plus proche certains résultats comme :

6,75 => 7
8,25 => 8
9,75 => 10
11,2 => 11
16,8 => 17
18,2 => 18....etc

Mais par contre, je souhaite conserver/obtenir la demi en décimal quand cela s'en rapproche également.

7,5 => 7,5
10,5 => 10,5
12,6 => 12,5
15,4 => 15,5...etc

Je précise que les demis en décimal dans les résultats sont soit présent (à conserver)
soit très proche à chaque fois (obtenir)
cela se termine toujours par x,6 ou x,4

Je pense pour le coup devoir créer une fonction de toute pièce pour cela mais je sèche un peu....

Merci aux âmes charitable pour votre aide Smiley smile
Modifié par Gianni54 (24 May 2016 - 09:52)
La technique consiste à faire
 y = Math.round(2 * x) / 2;

Par exemple
var x = 7.3;
var y = Math.round(2 * x) / 2;

donne y = 7.5

De même si tu veux arrondir au "quart d'entier" tu fais
var x = 7.3;
var y = Math.round(4 * x) / 4;

ça donne y = 7.25
Modifié par PapyJP (24 May 2016 - 10:26)
Technique simple et efficace !
Je vais essayer d'appliquer tout cela dans mon code.

Merci à toi !
Modifié par Gianni54 (24 May 2016 - 11:01)
Le seul petit soucis que j'ai c'est les résultats en x,25
Du coup le calcul m’arrondis le résultat à x,5 alors que je souhaite un entier proche

ex: 8,25

var x = 8,25;
var y = Math.round(2 * x) / 2;

donne 8,5

Alors que je souhaiterai 8

Il faudrait que Math.round arrondisse à l'inférieur les résultats en x,5 !

Mes variables contiennent ma formule de calcul qui me donne les résultats et je ne peut pas les éclater pour lui dire fais Math.round pour tel résultat et fais l'autre formule pour tel résultat
Modérateur
Bonjour tout le monde,

Gianni54 a écrit :
Le seul petit soucis que j'ai c'est les résultats en x,25
Du coup le calcul m’arrondis le résultat à x,5 alors que je souhaite un entier proche

ex: 8,25

var x = 8,25;
var y = Math.round(2 * x) / 2;

donne 8,5

Alors que je souhaiterai 8

Il faudrait que Math.round arrondisse à l'inférieur les résultats en x,5 !

Mes variables contiennent ma formule de calcul qui me donne les résultats et je ne peut pas les éclater pour lui dire fais Math.round pour tel résultat et fais l'autre formule pour tel résultat


Je ne comprends pas pourquoi tous ces calculs sur l'arrondi.

Selon MDN JS - Math.round() voici ce qu'il est dit :
Si la partie décimale du nombre est de .5 ou plus, l'argument est arrondi à l'entier supérieur le plus proche. Si la partie décimale est inférieure à .5, l'argument est arrondi à l'entier inférieur le plus proche.

Ce qui correspond à la norme internationale de l'arrondi.


J'ai regardé à ça car en Php il faut préciser un paramètre pour définir le type d'arrondi voulu. En JS, il en est autrement.

Bonne journée.
Modifié par Greg_Lumiere (24 May 2016 - 11:38)
Effectivement la fonction Math.round n'est fait que pour arrondir de façon simple à l'entier sup ou inf.
Après je recherche une solution simple pour faire ce que je souhaite sans forcément utiliser cette fonction.
Je dis juste que cette dernière fait une partie du boulot mais il me manque quelque-chose...
Après s'il faut fabriquer une fonction pour cela, je suis preneur
Bon finalement après avoir retourné le problème dans tous les sens, j'ai tout simplement décidé de modifier certaines données dans mes scripts de calcul et leur donner les valeurs qui "m'arrange" pour obtenir les résultats arrondis que je souhaite avec la méthode de PapyJP et ça fonctionne....

Merci encore en tout cas pour cette astuce !
Modifié par Gianni54 (24 May 2016 - 17:58)
Tu peux faire la même chose avec Math.floor ou Math.ceil pour un arrondi systématique à l'inférieur ou au supérieur.

P.ex. Math.floor(2*8.75)/2 donne 8.5, ou bien Math.ceil(2*5.25)/2 donne 5.5.

A mentionner aussi que Math.round(x) est équivalent à Math.floor(x+0.5) ou Math.ceil(x-0.5) (du moins tant qu'on reste dans les nombres positifs). Tu peux te servir de ça pour faire une fonction d'arrondi plus subtile.
Par exemple si tu veux arrondir au demi-point près, mais que tu veux ne passer à l'arrondi supérieur qu'au dernier dizième, i.e. 5.25 donnerait 5 et il faudrait au minimum 5.4 pour passer à 5.5, tu peux écrire Math.floor(2*(x+0.1))/2.

De manière générale, si on veut arrondir à x unités près, il faut diviser par x avant l'arrondi et multiplier par x après l'arrondi. Par exemple 5*Math.round(x/5) arrondit à 5 point près, tandis que Math.round(x*20)/20 qui est équivalent à écrire 0.05*Math.round(x/0.05) arrondit par paliers de 0.05.

Attention, les arrondis qui ne sont pas des puissances de 2 peuvent parfois donner des résultats inattendus. P.ex. Math.round(100.25/0.1)*0.1 = 100.300000001 vs. Math.round(100.25*10)/10 = 100.3.
Si on a besoin de l'arrondi pour affichage, il peut être utile de s'assurer qu'il n'y aura jamais plus que deux chiffres décimaux avec quelque chose du style string = nombre.toString().replace(/^(\d+\.\d{2})\d+$/, '$1') (désolé j'ai pas plus simple à proposer, on doit pouvoir faire mieux).
Merci pour ta proposition.
En effet j'avais déjà étudié les fonctions Math.floor() et Math.ceil() mais finalement, j'ai réussi à faire simple avec Math.round()
Mais je garde cependant toutes ces techniques en tête, elle me serviront certainement dans un futur proche Smiley cligne