Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de format ???

12 réponses
Avatar
LE TROLL
Bonjour,

J'ai un truc bizarre avec le format...

double = 8.5296
format(double,"00.00") = 8,53

???

Je ne lui ai pas dit "Round", je lui ai dit "Format" ???

Savez-vous comment corriger ça ?

--
Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.

10 réponses

1 2
Avatar
Jacques93
Bonjour LE TROLL,
LE TROLL a écrit :
Bonjour,

J'ai un truc bizarre avec le format...

double = 8.5296
format(double,"00.00") = 8,53

???

Je ne lui ai pas dit "Round", je lui ai dit "Format" ???




Format effectue un arrondi, qui est d'ailleurs parfois préféré à celui
de Round, essaie :

MsgBox (Round(2.5, 0)) ' donne 2
MsgBox (Format(2.5, "0")) ' donne 3

étonnant non !

Pour obtenir un nombre de décimales sans arrondi, il faut tronquer.
Cette fonction n'existe pas de base en VB, mais on peut l'implémenter.
Par exemple :

Private Function Truncate(d As Double, NumDec As Integer) As Double
' NumDec = Nombre de décimales désirées
Truncate = Int(d * 10 ^ NumDec) / (10 ^ NumDec)
End Function

...

MsgBox Format$(Truncate(d, 2), "00.00")

A la place de Int, on peut utiliser Fix qui a un comportement différent
avec les nombres négatifs :

<http://msdn.microsoft.com/en-us/library/aa445034(VS.60).aspx>


--

Cordialement,

Jacques.
Avatar
Jean-marc
Jacques93 wrote:

Hello,

Format effectue un arrondi, qui est d'ailleurs parfois préféré à celui
de Round, essaie :



Et pour tout savoir sur les arrondis en VB, je conseille la lecture de ce
petit article qui explique tout ça :
http://faq.vb.free.fr/index.php?question8" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr/index.php?question8

Pour les plus curieux, cet excellent article de la KB Microsoft
qui propose une dizaine de fonction d'arrondis, y compris
bien sur l'équivalent du "truncate" ci-dessus mentionné:
http://support.microsoft.com/?scid=kb;en-us;196652&x"&y


Bonne lecture,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Jean-Marc,
Jean-marc a écrit :
Jacques93 wrote:

Hello,

Format effectue un arrondi, qui est d'ailleurs parfois préféré à celui
de Round, essaie :



Et pour tout savoir sur les arrondis en VB, je conseille la lecture de ce
petit article qui explique tout ça :
http://faq.vb.free.fr/index.php?question8

Pour les plus curieux, cet excellent article de la KB Microsoft
qui propose une dizaine de fonction d'arrondis, y compris
bien sur l'équivalent du "truncate" ci-dessus mentionné:
http://support.microsoft.com/?scid=kb;en-us;196652&x"&y


Bonne lecture,




Ah la la, on ne pense jamais assez à la FAQ :-) , qui sur le coup est
plus complet que la doc MSDN qui ne mentionne, pas directement en tout
cas, le système d'arrondi au prochain entier pair :

http://msdn.microsoft.com/en-us/library/aa242034(VS.60).aspx

et est plus que succinct. En passant, le lien de la FAQ sur la doc MSDN :

http://msdn.microsoft.com/library/en-us/vbenlr98/html/vafctRound.asp

semble mort. Désolé ...

--

Cordialement,

Jacques.
Avatar
David
Bonjour à tous,

Voila ce que j'utilise pour faire l'arrondi dans mon
programme de facturation et qui n'a jamais été pris en défaut
depuis plusieurs années.

Public Function Trunc(ByVal x As Double, ByVal nbDec As Long) As Double
'-- Fonction de troncature à nbDec après la virgule

Dim strTemp As String
Dim k As Long

strTemp = Trim$(Str(x))
k = InStr(1, strTemp, ".")
If (k = 0) Then
'-- Il s'agit d'un nombre entier, on n'y touche pas
Trunc = x
Else
'-- On récupère nbDec chiffres derrière le point
Trunc = Val(Left$(strTemp, k + nbDec))
End If

End Function

Public Function MyRound(ByVal x As Double, ByVal nbDec As Long) As Double
'-- Fonction d'arrondi à nbDec après la virgule (x>0)

Dim s As Double

s = 1 / (2 * (Exp(nbDec * Log(10)))) * Sgn(x)
's = 0.5 / 100
MyRound = Trunc(x + s, nbDec)

End Function

a+ Jean-Pol
Site Web : www.colovid.be
Site Web perso pour le fun : http://users.skynet.be/DAVID/
Cette page est transmise avec des électrons 100% recyclés.


"Jean-marc" a écrit dans le message de news:
49aee6a3$0$2855$
Jacques93 wrote:

Hello,

Format effectue un arrondi, qui est d'ailleurs parfois préféré à celui
de Round, essaie :



Et pour tout savoir sur les arrondis en VB, je conseille la lecture de ce
petit article qui explique tout ça :
http://faq.vb.free.fr/index.php?question8" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr/index.php?question8

Pour les plus curieux, cet excellent article de la KB Microsoft
qui propose une dizaine de fonction d'arrondis, y compris
bien sur l'équivalent du "truncate" ci-dessus mentionné:
http://support.microsoft.com/?scid=kb;en-us;196652&x"&y


Bonne lecture,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
LE TROLL
Merci Jack,

Tu sais, ça va aussi vite de passer en string, de localiser la virgule et de
complèter les zéros si besoin...

--
Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Jacques93" a écrit dans le message de
news:
Bonjour LE TROLL,
LE TROLL a écrit :
Bonjour,

J'ai un truc bizarre avec le format...

double = 8.5296
format(double,"00.00") = 8,53

???

Je ne lui ai pas dit "Round", je lui ai dit "Format" ???




Format effectue un arrondi, qui est d'ailleurs parfois préféré à celui de
Round, essaie :

MsgBox (Round(2.5, 0)) ' donne 2
MsgBox (Format(2.5, "0")) ' donne 3

étonnant non !

Pour obtenir un nombre de décimales sans arrondi, il faut tronquer. Cette
fonction n'existe pas de base en VB, mais on peut l'implémenter.
Par exemple :

Private Function Truncate(d As Double, NumDec As Integer) As Double
' NumDec = Nombre de décimales désirées
Truncate = Int(d * 10 ^ NumDec) / (10 ^ NumDec)
End Function

...

MsgBox Format$(Truncate(d, 2), "00.00")

A la place de Int, on peut utiliser Fix qui a un comportement différent
avec les nombres négatifs :

<http://msdn.microsoft.com/en-us/library/aa445034(VS.60).aspx>


--

Cordialement,

Jacques.


Avatar
LE TROLL
Bonjour David,

Ce n'est pas pour ma part un problème d'arrondi, si Format
n'arrondissait pas.

En fait j'ai un problème de précision car je tente d'avoir avec une
multiplication unique 0,7108 le même résultat que X - 19,6% (tva) et du
reste -15% de commission, alors selon le montant de base, parfois c'est bon,
d'autres fois ça varie de + ou - 0.01
Je ne sais donc pas si mathématiquement je peux avec une seule opération en
faire deux, surtout avec ce vilain "Format" qui arrondi...

--
Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"David" a écrit dans le message de
news:%
Bonjour à tous,

Voila ce que j'utilise pour faire l'arrondi dans mon
programme de facturation et qui n'a jamais été pris en défaut
depuis plusieurs années.

Public Function Trunc(ByVal x As Double, ByVal nbDec As Long) As Double
'-- Fonction de troncature à nbDec après la virgule

Dim strTemp As String
Dim k As Long

strTemp = Trim$(Str(x))
k = InStr(1, strTemp, ".")
If (k = 0) Then
'-- Il s'agit d'un nombre entier, on n'y touche pas
Trunc = x
Else
'-- On récupère nbDec chiffres derrière le point
Trunc = Val(Left$(strTemp, k + nbDec))
End If

End Function

Public Function MyRound(ByVal x As Double, ByVal nbDec As Long) As Double
'-- Fonction d'arrondi à nbDec après la virgule (x>0)

Dim s As Double

s = 1 / (2 * (Exp(nbDec * Log(10)))) * Sgn(x)
's = 0.5 / 100
MyRound = Trunc(x + s, nbDec)

End Function

a+ Jean-Pol
Site Web : www.colovid.be
Site Web perso pour le fun : http://users.skynet.be/DAVID/
Cette page est transmise avec des électrons 100% recyclés.


"Jean-marc" a écrit dans le message de news:
49aee6a3$0$2855$
Jacques93 wrote:

Hello,

Format effectue un arrondi, qui est d'ailleurs parfois préféré à celui
de Round, essaie :



Et pour tout savoir sur les arrondis en VB, je conseille la lecture de ce
petit article qui explique tout ça :
http://faq.vb.free.fr/index.php?question8" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr/index.php?question8

Pour les plus curieux, cet excellent article de la KB Microsoft
qui propose une dizaine de fonction d'arrondis, y compris
bien sur l'équivalent du "truncate" ci-dessus mentionné:
http://support.microsoft.com/?scid=kb;en-us;196652&x"&y


Bonne lecture,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;










Avatar
PH
LE TROLL a écrit :
Bonjour David,

Ce n'est pas pour ma part un problème d'arrondi, si Format
n'arrondissait pas.

En fait j'ai un problème de précision car je tente d'avoir avec une
multiplication unique 0,7108 le même résultat que X - 19,6% (tva) et du
reste -15% de commission, alors selon le montant de base, parfois c'est
bon, d'autres fois ça varie de + ou - 0.01
Je ne sais donc pas si mathématiquement je peux avec une seule opération
en faire deux, surtout avec ce vilain "Format" qui arrondi...



tu dois faire -15% sur le hors taxe puis calculer la TVA et donner enfin
le résulta TTC

Soit PHT le prix hors TVA

PHT*0.15, la remise que tu arrondis comme tu le souhaites : par défaut,
par excès, standard

Tu retires la commission du PHT cela te donne P

Tu calcules la TVA

TVA = P*0.196 que tu arrondis

PTTC = P + TVA

Par contre des arrondis successifs ne te donneront pas le même résultat
suivant l'ordre des opérations.

(je crois que si tu calcules la commission sur le prix TTC tu dois payer
la TVA sur la ristourne octroyée).
Avatar
LE TROLL
Bonjour, merci...

Nons, c'est :

TTC - TVA (19,6%) = HT
HT - COM (15%) = NET

De facto la TVA est aussi payée évidemment sur la COM, donc dans cet ordre.

Alors moi j'ai fait :
TTC / 119,6 * 100 = HT
HT / 100 * 85 (com) = NET
<> entre TTC et NET = (TTC * 0,7108)


--
Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"PH" a écrit dans le message de
news:
LE TROLL a écrit :
Bonjour David,

Ce n'est pas pour ma part un problème d'arrondi, si Format
n'arrondissait pas.

En fait j'ai un problème de précision car je tente d'avoir avec une
multiplication unique 0,7108 le même résultat que X - 19,6% (tva) et du
reste -15% de commission, alors selon le montant de base, parfois c'est
bon, d'autres fois ça varie de + ou - 0.01
Je ne sais donc pas si mathématiquement je peux avec une seule opération
en faire deux, surtout avec ce vilain "Format" qui arrondi...



tu dois faire -15% sur le hors taxe puis calculer la TVA et donner enfin
le résulta TTC

Soit PHT le prix hors TVA

PHT*0.15, la remise que tu arrondis comme tu le souhaites : par défaut,
par excès, standard

Tu retires la commission du PHT cela te donne P

Tu calcules la TVA

TVA = P*0.196 que tu arrondis

PTTC = P + TVA

Par contre des arrondis successifs ne te donneront pas le même résultat
suivant l'ordre des opérations.

(je crois que si tu calcules la commission sur le prix TTC tu dois payer
la TVA sur la ristourne octroyée).


Avatar
jeanmarcnoury
On 4 mar, 22:39, Jacques93 wrote:

Hello Jacques,

En passant, le lien de la FAQ sur la doc MSDN :

   http://msdn.microsoft.com/library/en-us/vbenlr98/html/vafctRound.a sp

semble mort. Désolé ...




Merci de le signaler!
On va changer ça dans la prochaine release ...


Bonne journée !


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
François Picalausa
On 0304 "LE TROLL" <le wrote:
format(double,"00.00") = 8,53


On 0305,
De facto la TVA est aussi paye videmment sur la COM, donc dans cet ordre.



Hello,

Je n'ai pas suivit toute la discussion donc il se peut que mon
commentaire ne soit pas pertinent, mais - excepté le "problème"
d'arrondi - le type double est-il vraiment le type voulu ? Il existe
Currency est probablement plus approprié (particulièrement au niveau
précision) :

<citation src="documentation VBA">
The Currency data type is useful for calculations involving money
[...] in which accuracy is particularly important.
</citation>

François
1 2