Est-il possible d'utiliser des types de données décimaux tels que decimal32
, decimal64
ou decimal128
dans mes programmes C++?
Les classes de Decimal TR ne sont pas implémentées pour tous les compilateurs. Certains compilateurs, par exemple, gcc , implémentent le C Decimal TR et fournissent également les extensions correspondantes en C++. Dans le passé, il existait une implémentation open source pour la TR décimale C++ disponible, mais je n’ai pas réussi à la localiser. Si votre compilateur ne prend pas en charge les types décimaux, la meilleure solution consiste probablement à créer un wrapper pour la bibliothèque decNumber d'IBM .
Pour améliorer la situation future du C++, j'ai créé un plan visant à mettre à jour le TR et je vais transformer le TR actuel en une proposition complète prête pour la prochaine réunion du comité C++ (en avril à Bristol). , en essayant de l’adapter au standard C++, éventuellement à la révision prévue pour 2014. L’implémentation que j’ai fait partie de mon travail habituel et c’est à moi de décider si elle peut être rendue publique bien certains espèrent qu'il pourra être open source à un moment donné.
Vous pouvez utiliser une solution d’en-tête simple pour le C++ avec des modèles simples: https://github.com/vpiotr/decimal_for_cpp
Notez que ce n'est pas une classe * Big * Decimal; il est limité à 64 bits de "mantisse".
[tiré du lien]
#include "decimal.h"
using namespace dec;
// the following declares currency variable with 2 decimal points
// initialized with integer value (can be also floating-point)
decimal<2> value(143125);
// to use non-decimal constants you need to convert them to decimal
value = value / decimal_cast<2>(333.0);
// output values
cout << "Result is: " << value << endl;
// this should display something like "429.80"
// to mix decimals with different precision use decimal_cast
decimal<6> exchangeRate(12.1234);
value = decimal_cast<2>(decimal_cast<6>(value) * exchangeRate);
cout << "Result 2 is: " << value << endl;
// this should display something like "5210.64"
cout << "Result 2<6> is: " << decimal_cast<6>(value) << endl;
// this should display something like "5210.640000"
utilisez un int32 ou un int64 et déplacez (manuellement) le point décimal à l'endroit souhaité. Si vous mesurez des dollars, par exemple, mesurez plutôt les cents et affichez la valeur différemment. simple!
Boost a aussi cpp_dec_float. C'est probablement la meilleure solution jusqu'à son adoption dans la norme.
gcc/clang vient (généralement) avec ses propres implémentations décimales à virgule flottante, si votre distribution décide de les compiler dans la version de gcc/clang proposée (ce n'est pas le cas de certaines distributions de bras que j'ai essayées). C'est pourquoi vous avez parfois besoin d'une implémentation de type décimal personnalisée. Essayez à moi pour des idées (testé sur i586 jusqu’à aarch64).