une solution serait de conserver des strings en mémoire
et de ne pas les convertir en float pour les calculs
mais d'effectuer les calculs 'a la main ' de la même façon qu'a l'école ^^
voila un début de solution addition et multiplications ne geres pas les nombres negatifs
Code : Tout sélectionner
Declare.s multiply(st1$,st2$)
Declare.s addition(st1$,st2$)
Declare.s soustraction(st1$,st2$)
Debug multiply("20.5","35.0")
Debug addition("20.2","35.58")
Procedure.s multiply(st1$,st2$)
V1=Len(st1$)-FindString(st1$,".",1) ; nombre de decimales
V2=Len(st2$)-FindString(st2$,".",1) ; nombre de decimale
If v1=Len(st1$):v1=0:EndIf
If v2=Len(st2$):v2=0:EndIf
st1$=RemoveString(st1$,".")
st2$=RemoveString(st2$,".")
;multiplication
result$=Str(Val(st1$)*Val(st2$))
result$=(Left(result$,Len(result$)-(V1+V2))+"."+Right(result$,(v1+v2)))
ProcedureReturn result$
EndProcedure
Procedure.s addition(st1$,st2$)
V1=Len(st1$)-FindString(st1$,".",1) ; nombre de decimales
V2=Len(st2$)-FindString(st2$,".",1) ; nombre de decimale
;
If v1=Len(st1$):v1=0:EndIf
If v2=Len(st2$):v2=0:EndIf
If v2<>V1
If v1>V2
If v2=0 ; pas de virgule
st2$=st2$+"."+Space(V1-v2)
Else
st2$=st2$+"."+Space(V1-v2)
EndIf
EndIf
If v2>v1
If v1=0 ; pas de virgule
st1$=st1$+Space(V2-v1)
Else
st1$=st1$+Space(V2-v1)
EndIf
EndIf
EndIf
If Len(st1$)>Len(st2$)
st2$=Space(Len(st1$)-Len(st2$))+st2$
EndIf
If Len(st2$)>Len(st1$)
st1$=Space(Len(st2$)-Len(st1$))+st1$
EndIf
ret=0
For a=Len(st1$) To 1 Step -1
If Mid(st1$,a,1)<>"."
ad=Val(Mid(st1$,a,1))+Val(Mid(st2$,a,1))
If ad>10
ad=ad-10
ret=1
Else
ret=0
EndIf
result$=Str(ad)+result$
Else
result$="."+result$
EndIf
Next
If v2=0 And v1=0 ; pas de virgule on enleve les zero au debut
result$=ReplaceString(LTrim(ReplaceString(result$,"0"," "))," ","0")
Else ; on enleve les zero des deux cotes
result$=ReplaceString(LTrim(RTrim(ReplaceString(result$,"0"," ")))," ","0")
EndIf
ProcedureReturn result$
EndProcedure
bon courage pour tout implémenter personnellement je ne pense pas aller plus loin pour l'instant.
edit :correction de bug le code enlevait les zero en debut et fin de resultat meme si il n'y avais pas de virgule
050 devenais 5 au lieu de 50