web-dev-qa-db-fra.com

Types de données décimales C++

Est-il possible d'utiliser des types de données décimaux tels que decimal32, decimal64 ou decimal128 dans mes programmes C++?

32
fpiro07

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é.

25
Dietmar Kühl

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"
13
Piotr

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!

4
gbjbaanb

Boost a aussi cpp_dec_float. C'est probablement la meilleure solution jusqu'à son adoption dans la norme. 

https://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html

1
David Bradley

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).

0
user1095108