|
Dernière réponse | ||
---|---|---|
Sujet : arrondi [delphi] | ||
AGA |
|
Aperçu |
---|
Vue Rapide de la discussion |
---|
AGA |
|
antp |
|
rufo |
|
antp |
|
rufo |
|
antp |
|
JPA | -> antp ta solution me parait la plus simple (c'est celle que j'utilisait), mais j'ai un doute : tu écris : nombre_virgule := round(nombre_virgule*100)/100; or round transforme en integer (double je crois) => nombre_virgule deviendra un Integer (Entier divisé par entier). Moi, j'écrirais : nombre_virgule := round(nombre_virgule*100)/100.0; Qu'en pense-tu ? A+ |
endemyon | Jai vu une fonction RoundTo qui devrait convenir :
type TRoundToRange = -37..37; function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double; Description Call RoundTo to round AValue to a specified power of ten. AValue is the value to round. ADigit indicates the power of ten to which you want AValue rounded. It can be any value from –37 to 37 (inclusive). RoundTo uses “Banker’s Rounding” to determine how to round values that are exactly midway between the two values that have the desired number of significant digits. This method rounds to an even number in the case that AValue is not nearer to either value. The following examples illustrate the use of RoundTo: Expression Value RoundTo(1234567, 3) 1234000 RoundTo(1.234, -2) 1.23 RoundTo(1.235, -2) 1.24 RoundTo(1.245, -2) 1.24 Note: The behavior of RoundTo can be affected by the Set8087CW procedure or SetRoundMode function. mais quand je l'utilise dans la ligne temp:=RoundTo(StrToFloat(lbFrancs.Caption)/taux,-2); j'obtiens une erreur à la compilation : undeclared identifier RoundTo. Je comprends pas pourquoi. |
antp | faudrait peut-être penser à aller voir la fonction "Round" de Delphi...
si tu veux garder les deux dernières décimales, tu fais : nombre_virgule := round(nombre_virgule*100)/100; si tu veux pas garder les décimales: nombre_entier := round(nombre_virgule); Bon y a peut etre des conversions entier <-> flottant à faire mais c'est plus propre et rapide que de passer par des chaînes...
[edtdd]--Message édité par antp--[/edtdd] |
rufo | voilà, normalement, tu peux la réutiliser tranquille (change juste l'en-tête :
function TF_Liste_Cocktails.Tronque(Valeur: Real):Real; |
rufo | function TF_Liste_Cocktails.Tronque(Valeur: Real):Real;
var Nombre, Decimal, Entier: string ; i: SmallInt ; Trouve: Boolean ; begin // Ne garde que 2 chiffres après la virgule Nombre := FloatToStr(Valeur) ; i := 1 ; Trouve := False ; while (i <= Length(Nombre)) and (not Trouve) do begin // Rechercher de la virgule if (Nombre[i] = #44) or (Nombre[i] = #46) then Trouve := True ; Inc(i) ; end ; if Trouve then begin try Nombre := Copy(Nombre, 1, i+1) ; // Arondi au 0.05 supérieur Decimal := Copy(Nombre, i, 2) ; Entier := Copy(Nombre, 1, i-2) ; if Decimal[2] > #53 then begin // dernière décimale supérieure à 5 Decimal[2] := #48 ; // 0 if Decimal[1] < #57 then Decimal[1] := Succ(Decimal[1]) // on augmente d'un 10ème else begin // passage à l'unité supérieure Decimal[1] := #48 ; // 0 Entier := IntToStr(StrToInt(Entier) + 1) ; end ; end else Decimal[2] := #53 ; Nombre := Entier + Nombre[i-1] + Decimal ; except Nombre := Copy(Nombre, 1, i) end ; Tronque := StrToFloat(Nombre) ; end else Tronque := Valeur ; end ; |
rufo |
|
endemyon | Il n'y a pas une fonction toute faite pour une chose aussi simple dans delphi?
Si non ta fonction m'interesse merci. |
rufo | le mieux, c'est de passer par une chaine de caractères:
Chaine_Nombre := FloatToStr(Nombre) ; ensuite 1) trouver la position de la virgule (',') 2) séparer dans 2 chaines la partie entière et décimale 3) vérifier si le 3ème caractère après la virgule est > au caractère '5' (pour voir s'il faut arrondir) 4) dans le cas où on arrondi, vérifier s'il ne faut pas incrémenter la partie entière 5) concaténer les 2 chaines: Chaine_Ent + ',' + Chaine_Dec 6) StrToFloat du résultat pour avoir à nouveau un nombre... si tu peux attendre qq heures, je te filerais une fct que j'avais faite pour arrondir aux 0.05 supérieur, ça pourra t'aider ex: 2.23 -> 2.25 :) |
endemyon | Arrondir. C'est pour convertir des francs en euro et vis versa |
rufo |
|
endemyon | Question de débutant : comment arrondir un nombre avec 2 chiffre apres la virgule? |