Arondire un nombre suivent le mode souhaiter

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Arondire un nombre suivent le mode souhaiter

Message par dayvid »

Bonjour !

Comme je ne savais pas trop quoi faire, j'ai eu l'idée de crée une fonction
pour arrondir un nombre suivent le mode choisie:

Code : Tout sélectionner

#Non_Arondi = 0
#Arondi_Entier = 1
#Arondi_Auto = 2
#Arondi_Bas = 3
#Arondi_Haut = 4
#Arondi_Dizaine_Auto = 5
#Arondi_Dizaine_Haut = 6
#Arondi_Dizaine_Bas = 7
#Arondi_Paire_Auto = 8
#Arondi_Paire_Haut = 9
#Arondi_Paire_Bas = 10
#Arondi_Impaire_Auto = 11
#Arondi_Impaire_Haut = 12
#Arondi_Impaire_Bas = 13

Procedure.l CountNombre(Multiple, Totale.f)
  ProcedureReturn Int(Totale/Multiple)
EndProcedure

Procedure.f ArondiNombre(Nombre.f, Multiple, Mode)
  
  If Multiple = 0
    Multiple = 1
  EndIf
  
  If Mode = 1
    Nombre = Int(Nombre)
    
  ElseIf Mode = 2
    Nombre = Round(Nombre, #PB_Round_Nearest)
    
  ElseIf Mode = 3
    Nombre = Round(Nombre, #PB_Round_Down)
    
  ElseIf Mode = 4
    Nombre = Round(Nombre, #PB_Round_Up)
    
  ElseIf Mode = 5
    CountNombre = CountNombre(10, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 10
    
    If Reste.f >= 5
      Nombre = CountNombre * 10 + 10
    Else
      Nombre = CountNombre * 10
    EndIf
    
  ElseIf Mode = 6
    CountNombre = CountNombre(10, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 10
    
    Nombre = CountNombre * 10 + 10
    
  ElseIf Mode = 7
    CountNombre = CountNombre(10, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 10
    
    Nombre = CountNombre * 10
    
  ElseIf Mode = 8
    CountNombre = CountNombre(2, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 2
    If Reste > 0.5
      Nombre = 2 * CountNombre + 2
    Else
      Nombre = 2 * CountNombre
    EndIf
    
  ElseIf Mode = 9
    CountNombre = CountNombre(2, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 2
    If Reste > 0
      Nombre = 2 * CountNombre + 2
    Else
      Nombre = 2 * CountNombre
    EndIf
    
  ElseIf Mode = 10
    CountNombre = CountNombre(2, Nombre.f)
    Nombre = 2 * CountNombre
    
  ElseIf Mode = 11
    CountNombre = CountNombre(3, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 3
    Debug Reste
    
    If Nombre.f > 1 And Nombre.f < 3
      
      If Nombre.f < 3
        
        If Nombre.f > 2
          Nombre.f = 3
        Else
          Nombre.f = 1
        EndIf
        
      ElseIf Nombre.f >= 3
        
        If Reste > 0
          
          If Reste <= 1
            Nombre = 3 * CountNombre
          Else
            Nombre = 3 * CountNombre + 2
          EndIf
          
        Else
          Nombre = 3 * CountNombre
        EndIf
        
      Else
        Nombre.f = 3
      EndIf
      
    ElseIf Nombre.f >= 0
      Nombre.f = 1
      
    EndIf
    
  ElseIf Mode = 12
    CountNombre = CountNombre(3, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 2
    
    
  ElseIf Mode = 13
    CountNombre = CountNombre(3, Nombre.f)
    Reste.f = Nombre.f - CountNombre * 2
    
    
  EndIf
  
  ProcedureReturn Nombre
EndProcedure

NombreArondi.f = ArondiNombre(7, 4, 11)
Debug NombreArondi





; IDE Options = PureBasic 4.60 Beta 1 (Windows - x86)
; CursorPosition = 99
; FirstLine = 84
; Folding = -
; EnableXP
; EnableUser
; EnableOnError
; EnableCompileCount = 356
; EnableBuildCount = 0
; EnableExeConstant
Mais à partir du mode 11, je n’y arrive plus

En faite je voudrais une fonction qui

Arrondisse nombre suivent les modes que je veux :

#Non_Arondi = 0
#Arondi_Entier = 1
#Arondi_Auto = 2
#Arondi_Bas = 3
#Arondi_Haut = 4
#Arondi_Dizaine_Auto = 5
#Arondi_Dizaine_Haut = 6
#Arondi_Dizaine_Bas = 7
#Arondi_Paire_Auto = 8
#Arondi_Paire_Haut = 9
#Arondi_Paire_Bas = 10
#Arondi_Impaire_Auto = 11
#Arondi_Impaire_Haut = 12
#Arondi_Impaire_Bas = 13

Enfin bref je me complique certainement comme d’habitude quoi
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par falsam »

Parfois je me demande !!!
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par Chris »

falsam a écrit :Parfois je me demande !!!
Moi, ça fait longtemps que je me demande même plus. Je zappe systématiquement.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Arondire un nombre suivent le mode souhaiter

Message par G-Rom »

je t'ai codé une fonction pour toi :

Code : Tout sélectionner

; Phonction super optimiséz darondi de nombres à point



; Some macros , for simplify our life...
Macro _ :  Macro : EndMacro
_ ___
Procedure 
EndMacro

_ ____
EndProcedure 
EndMacro

_ _____
If 
EndMacro

_ ______
Else
EndMacro

_ _______
ElseIf
EndMacro

_ ________
EndIf 
EndMacro

_ _________
For
EndMacro

_ __________
To
EndMacro

_ ___________
Next 
EndMacro


#Arondy_ba = 0
#arhondi_heau   = 1
#arrhondi_prey = 2

___  NothingToDo(Float.f, Round) 
_____ Float > 0
  Float * 10
______ 
  Float = (Float * -1) * 10
________ 
_____ Foo = ThisIsABasicTest + 1 And IamFoo < headOfVeau-4
  !POP EAX
  !PUSH EAX
  _______ 4+1 = 8
  !POP ECX
  !PUSH ECX
  _______ 4+2 = 8
  !POP EBX
  !PUSH EBX
________ 
____

___ CallNothingTodo(Float.f, Round) 
  _________ i = 0 __________ 100
    Float + 1
  ___________ 
  
  _________ i = 0 __________ 100
    Float - 1
  ___________ 
  
  _________ i = 0 __________ 100
    Float + 2
  ___________ 
  
  _________ i = 0 __________ 100
    Float - 2
  ___________ 
  
  _________ i = 0 __________ 1000
    NothingToDo(Float , Round)
  ___________   
____

___ RoundEX(Float.f, Round) ; Push !!!!
  !PUSH EAX
  !PUSH EBX
  !PUSH ECX
  !PUSH EDX
  
  _____ EAX = FOO+4 & (A=B Or MyProcessorCantComputeFloat = 2012)
    CallNothingTodo(Float , round)
  ______
    r.f = Round(Float,Round)  ; Pope !!!!
  ________ 
    
  !POP EAX
  !POP EBX
  !POP ECX
  !POP EDX
  
  _____ ECX = FOO+4 & (A=B Or MyProcessorCantComputeFloat = 732)
    CallNothingTodo(Float , round)
  ______
    r.f = Round(Float,Round)
  ________ 
    
  ProcedureReturn r
____







;-TESTE

Debug RoundEX(10.5,#Arondy_ba)


RoundEX(10.5,#Arondy_ba) te renvois 10 au lieu de 10.5 , super non ?
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par Jacobus »

Image
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Arondire un nombre suivent le mode souhaiter

Message par anissa »

Je me demande vraiment pourquoi tu te casses si durement la tête pour si peu de chose Dayvid !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par Le Soldat Inconnu »

Vous êtes quand même un peu vache, les gars :?

Ça n'a pas forcément d'utilité, mais ça permet d'apprendre.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par falsam »

Le Soldat Inconnu a écrit : .... Ça n'a pas forcément d'utilité .....
Vache dis tu ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Arondire un nombre suivent le mode souhaiter

Message par dayvid »

G-Rom, merci beaucoup :)

Cependant je n'est pas réussi a comprendre comment cella marchai

Et oui je me complique la vie je le sais bien mais comme as dit LSI
ça permet d'apprendre :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Arondire un nombre suivent le mode souhaiter

Message par G-Rom »

dayvid a écrit :G-Rom, merci beaucoup :)

Cependant je n'est pas réussi a comprendre comment cella marchai

Et oui je me complique la vie je le sais bien mais comme as dit LSI
ça permet d'apprendre :)

C'était de l'humour vaseuse, Round() suffit pour arrondir un nombre.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Arondire un nombre suivent le mode souhaiter

Message par djes »

Avec la fonction de G-Rom, dayvid fera un malheur quand il sera employé chez Microsoft.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par Chris »

djes a écrit :Avec la fonction de G-Rom, dayvid fera un malheur quand il sera employé chez Microsoft.
Il fera surtout le malheur de Microsoft! :mrgreen:
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Arondire un nombre suivent le mode souhaiter

Message par dayvid »

Ah ha :roll: , très drôle :roll:

A pis tien, c'est vraie que c'est drôle en faite :lol:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Arondire un nombre suivent le mode souhaiter

Message par falsam »

je serais curieux de savoir ce que tu veux arrondir avec plus de 10 décimales. A ce stade là on parle plutôt de précision. En attendant d'en savoir plus, je te propose un code en quelques lignes.

Code : Tout sélectionner

Procedure.s RoundX(Value.d, Decimal.w)
  Protected Number.d
  
  Number= Int(Value * Pow(10, Decimal) + 0.5) / Pow(10, Decimal)
  ProcedureReturn StrD(Number, Decimal)
EndProcedure

Debug RoundX(23.92568, 7)
Debug RoundX(23.92568, 6)
Debug RoundX(23.92568, 5)
Debug RoundX(23.92568, 4)
Debug RoundX(23.92568, 3)
Debug RoundX(23.92568, 2)
Debug RoundX(23.92568, 1)
Debug RoundX(23.92568, 0)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Arondire un nombre suivent le mode souhaiter

Message par blendman »

Ah, cool pour la dernière procédure, elle m'a m'être utile !
Vous avez d'autres "fonctions mathématiques" de ce genre ? :D
Répondre