Page 1 sur 2

Arondire un nombre suivent le mode souhaiter

Publié : mer. 13/avr./2011 12:33
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

Re: Arondire un nombre suivent le mode souhaiter

Publié : mer. 13/avr./2011 18:36
par falsam
Parfois je me demande !!!

Re: Arondire un nombre suivent le mode souhaiter

Publié : mer. 13/avr./2011 18:40
par Chris
falsam a écrit :Parfois je me demande !!!
Moi, ça fait longtemps que je me demande même plus. Je zappe systématiquement.

Re: Arondire un nombre suivent le mode souhaiter

Publié : mer. 13/avr./2011 19:09
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 ?

Re: Arondire un nombre suivent le mode souhaiter

Publié : mer. 13/avr./2011 20:07
par Jacobus
Image

Re: Arondire un nombre suivent le mode souhaiter

Publié : mer. 13/avr./2011 21:20
par anissa
Je me demande vraiment pourquoi tu te casses si durement la tête pour si peu de chose Dayvid !

Re: Arondire un nombre suivent le mode souhaiter

Publié : jeu. 14/avr./2011 21:46
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.

Re: Arondire un nombre suivent le mode souhaiter

Publié : jeu. 14/avr./2011 22:49
par falsam
Le Soldat Inconnu a écrit : .... Ça n'a pas forcément d'utilité .....
Vache dis tu ?

Re: Arondire un nombre suivent le mode souhaiter

Publié : ven. 15/avr./2011 13:28
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 :)

Re: Arondire un nombre suivent le mode souhaiter

Publié : ven. 15/avr./2011 14:12
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.

Re: Arondire un nombre suivent le mode souhaiter

Publié : ven. 15/avr./2011 14:16
par djes
Avec la fonction de G-Rom, dayvid fera un malheur quand il sera employé chez Microsoft.

Re: Arondire un nombre suivent le mode souhaiter

Publié : ven. 15/avr./2011 15:06
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:

Re: Arondire un nombre suivent le mode souhaiter

Publié : sam. 16/avr./2011 13:45
par dayvid
Ah ha :roll: , très drôle :roll:

A pis tien, c'est vraie que c'est drôle en faite :lol:

Re: Arondire un nombre suivent le mode souhaiter

Publié : sam. 16/avr./2011 20:18
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)

Re: Arondire un nombre suivent le mode souhaiter

Publié : mar. 19/avr./2011 9:09
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