[Résolu][Calc] Cell.SetValue() transforme nombre flottant

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
kero
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 12 août 2016 15:44

[Résolu][Calc] Cell.SetValue() transforme nombre flottant

Message par kero »

Bonjour,

J'ai un souci avec une macro qui doit définir le contenu d'une cellule à partir d'un nombre décimal. Le problème est que lorsque j'exécute la macro, le nombre est transformé. Par exemple, si le nombre d'origine est 2,82, le résultat dans la cellule est 2,8199999332428.

Le code que j'utilise est du type :

Code : Tout sélectionner

Cellule.SetValue(Flottant)
ou :

Code : Tout sélectionner

Cellule.Value = Flottant
À noter que dans d'anciennes macros, j'ai déjà pu définir le contenu d'une cellule par ce genre de code, mais le flottant venait toujours d'une autre cellule. Jamais eu de problème. Mais maintenant je souhaite introduire un nombre flottant qui vient d'une base de données (extrait par un code de type ResultSet.getFloat(x)). Toutefois, il n'est pas nécessaire qu'il vienne d'une base de donnée, puisque j'ai constaté que le problème se pose même si je définis la variable directement dans le code de la macro, comme dans l'exemple ci-joint.

Voilà voilà... J'ai pas mal cherché sur le sujet mais je trouve rien. Si quelqu'un avait une idée. Merci de m'avoir lu. :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par kero le 27 avr. 2018 19:05, modifié 1 fois.
Libreoffice 5.4.5.1 (sur Archlinux)
Avatar de l’utilisateur
rollmops
PassiOOnné
PassiOOnné
Messages : 669
Inscription : 20 déc. 2017 14:45

Re: [Calc] Cell.SetValue() transforme nombre flottant

Message par rollmops »

Bonsoir,
Pourquoi ne pas déclarer ta variable en monétaire ?
Dim TempVar as currency
OpenOffice 4.1.15 - Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Cell.SetValue() transforme nombre flottant

Message par Hubert Lambert »

Bonjour,

Calc ne connaît que le format "double". Donc :

Code : Tout sélectionner

dim TempVar as double
ou pas de déclaration du tout (le programme convertira en double automatiquement).
Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
kero
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 12 août 2016 15:44

Re: [Calc] Cell.SetValue() transforme nombre flottant

Message par kero »

Bonsoir,

Merci à tous les deux pour vos réponses. La solution avec le type "currency" fonctionne, en revanche avec "double" le même problème demeure. Je ne serais pas contre l'idée de mieux comprendre comment tout ça se goupille.
Libreoffice 5.4.5.1 (sur Archlinux)
kero
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 12 août 2016 15:44

Re: [Calc] Cell.SetValue() transforme nombre flottant

Message par kero »

Bon, en fait la variante en "currency" pose problème aussi. Dans le cas où les données viennent d'une base de données, lors du traitement de certains enregistrement le code transforme mes données (exemple: 3268,43 devient 3268,4299), et dans d'autres cas la valeur d'origine est maintenue.

C'est très curieux...

Pour le moment j'ai trouvé une solution temporaire très sale, qui consiste à convertir la donnée numérique en string, que je passe ensuite en argument pour le SetValue.

J'essayerai de builder un testcase plus complet pour illustration dès que j'aurai l'énergie.
Libreoffice 5.4.5.1 (sur Archlinux)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Cell.SetValue() transforme nombre flottant

Message par Hubert Lambert »

Si tu reçois les valeurs de l'extérieur au format "single", il n'y a pas grand chose à faire (sauf à modifier si possible la définition des tables sources, et encore...).
Dans la mesure où, semble-t-il, la précision d'un "double" n'est pas importante dans ton cas il y a au moins deux solutions :
- passer par la représentation textuelle comme tu le proposes, ce qui n'a rien de vraiment très sale;
- modifier le format numérique de la cellule pour n'afficher que deux décimales.
Cordialement.

PS. Un peu de lecture (en anglais), si tu as les neurones biens accrochés :wink: : https://en.wikipedia.org/wiki/Single-pr ... int_format.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
kero
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 12 août 2016 15:44

Re: [Calc] Cell.SetValue() transforme nombre flottant

Message par kero »

Hello,

Bon. Je suis retombé sur le même problème mais dans un contexte différent. Je crois comprendre que le problème se situe dans l'utilisation de valeurs "single" - et cela même si les valeurs sont définies localement (ainsi si je cast une valeur externe en string, puis en single), tout en considérant que Libreoffice Basic ne semble pas fournir d'outils pour traiter des nombres définis comme decimals dans la base de données.

Mais tout n'est pas encore parfaitement clair pour moi. Je me demande si je ne devrais pas passer à un langage plus puissant, comme python, pour pouvoir gérer des situations comme celle-là (et même, tout translater en mysql/python). Ne serait-ce que pour la document et le support disponibles.

En tout cas, pour l'instant, la solution la plus propre que j'ai trouvé est d'utiliser la fonction round(nombre, longueur).

Enfin, merci à tous ceux qui m'ont donné leurs suggestions et m'ont permis d'avancer sur le problème.
Libreoffice 5.4.5.1 (sur Archlinux)