Gambas France BETA


Pas de compte ? Incription

Distributivité

Ce sujet est résolu.

1
AuteurMessages
valaquarus#1 Posté le 4/7/2022 à 02:22:45
-- Unus Ex Altera --Bonsoir à tous,
je vous invite à tester ceci :
1
lasomme = (tb1.Value * 100 - Int(tb1.Value) * 100)
ou ceci
1
lasomme = (tb1.Value - Int(tb1.Value)) * 100

et bien on n'obtient pas le même résultat à cause de l'arrondi de Int qui n'intervient pas au même moment.
Essayez avec des grands nombres au dessus de 22 000 000,00, par exemple avec 22 000 000,34
dans le premier cas on obtient bien 34, dans le second on obtient 33.
Pour moi et mes Maths, c'est une bizarrerie.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
spheris#2 Posté le 4/7/2022 à 05:35:23
Philippe,
version 3.14 de GB, je ne trouve pas 34 mais bien 33.99999999850988 car je déclare la variable lasomme comme un float.
Effectivement lasomme en integer me renvoit 34.

Attention de bien utiliser des float sur toute la ligne et d'effectuer la conversion en integer après.
Patrick#3 Posté le 4/7/2022 à 09:05:28
Pour partiellement résoudre ce problème j'avais fait cette fonction :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
PUBLIC FUNCTION arrondi(montant AS VARIANT, ndec AS INTEGER) AS FLOAT

DIM retour AS FLOAT
DIM pfrac, multp, i AS INTEGER
DIM ch, ch1 AS STRING
DIM tab AS String[]
DIM neg AS BOOLEAN

IF TypeOf(montant) = gb.String THEN
montant = Replace(montant, ".", ",")
retour = Val(montant)
ELSE
retour = montant
ENDIF
IF retour < 0 THEN
retour = Abs(retour)
neg = TRUE
ENDIF
multp = 1
FOR i = 1 TO ndec
multp = multp * 10
NEXT
IF Round(retour, -ndec) = 0 THEN retour = 0
ch = Str(retour)
ch = Str(Val(ch) * multp)
tab = Split(ch, ",")
IF tab.Count = 2 THEN
ch1 = Left(tab[1], 1)
IF Val(ch1) >= 5 THEN
tab[0] = Str(Val(tab[0]) + 1)
retour = Val(tab[0]) / multp
ELSE
retour = Val(tab[0]) / multp
ENDIF
ENDIF
IF neg THEN retour = retour * -1
RETURN retour

END
valaquarus#4 Posté le 4/7/2022 à 10:42:47
-- Unus Ex Altera --Merci à tous les deux,
effectivement vous avez raison sur la forme mais sur le fond je reste dubitatif sur des fonctions qui ne font leur travail correctement et qu'il faille les "compenser".
dans le premier cas, la multiplication est bien prioritaire
1
lasomme = (tb1.Value * 100 - Int(tb1.Value) * 100)
dans le deuxième cas, il semble que la soustraction se fasse d'abord et la multiplication, ensuite ce qui me file des boutons de fièvre.
1
lasomme = (tb1.Value - Int(tb1.Value)) * 100

Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
valaquarus#5 Posté le 4/7/2022 à 10:57:09
-- Unus Ex Altera --Pour ceux que les maths passionnent, un lien pertinent sur ce thème : Partie entière et partie fractionnaire.
En lisant je tombe la dessus Problème des pièces de monnaie
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
valaquarus#6 Posté le 4/7/2022 à 20:51:26
-- Unus Ex Altera --@Patrick,
juste une question bête mais qui me tracasse, dans ta fonction, comment assignes tu, ndec, qui doit être le nombre de décimales voulu ?
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
linuxos#7 Posté le 5/7/2022 à 02:15:00
Un peu de sel, de poivre et la crevette sera... valaquarus,

Le deuxième calcul est me semble-t-il correcte, car au niveau informatique, priorité va sur les 'opérateur': *, /, + ,-
mais aussi de l'intérieur des parenthèses vers l'extérieur des parenthèses, ce qui fait que ' (tb1.Value - Int(tb1.Value)) ' est effectué en premier, puis '* 100'

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
valaquarus#8 Posté le 5/7/2022 à 09:52:04
-- Unus Ex Altera --@Liuxos,
merci de cette réponse qui est rassurante même si je pensais que l'informatique et les maths marchaient de concert, il y a des dérogations qu'il faut apprendre à repérer.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
spheris#9 Posté le 5/7/2022 à 15:37:35
Valaquarus,

Excuse moi cette question, mais,

Pour quelle raison convertis-tu tout de suite tb1.value? peux tu m'expliquer quel avantage y a til à faire cela?

Je ne comprends pas bien pourquoi tu mélanges des float et des integer dans la fonction.

J'ai, par principe de programmation,l'habitude de traiter les float avec les float puis de convertir le résultat en integer.

valaquarus#10 Posté le 5/7/2022 à 16:33:27
-- Unus Ex Altera --Non, spheris ,
cette question me semble pertinente mais j'avoue qu'elle me laisse sans voix car je n'y aie pas réfléchi.
Ici je faisais la récupération d'une valeur float qui doit servir dans un calcul interger donc obligation de conversion en antériorité.
1
lasomme = (tb1.Value * 100 - Int(tb1.Value) * 100)
est la même chose que d'écrire
1
lasomme=Frac(tb1.value)*100
qui est un integer.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
spheris#11 Posté le 5/7/2022 à 16:46:45
C'est bien la même chose effectivement ..... et me semble-t-il la même erreur.
J'ecrirais plutôt cela :

1
2
3
4
5
DIM la somme AS INTEGER
DIM var1 AS FLOAT

var1 = tb1.value * 100
lasomme = CInt(var1)

valaquarus#12 Posté le 5/7/2022 à 17:53:14
-- Unus Ex Altera --D'accord je n'avais compris où tu m'emmenais.
Personnellement je ne vois pas la nécessité de passer par une variable intermédiaire.
Pour moi, ça:
1
2
3
4
5
DIM la somme AS INTEGER
DIM var1 AS FLOAT

var1 = tb1.value * 100
lasomme = CInt(var1)
et ça :
1
2
DIM lasomme AS INTEGER
lasomme=CInt(tb1.value)*100
c'est la même chose dans les faits mais je suis preneur si tu me dis que c'est mieux.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
1