40

有没有办法在我的 C++ 程序中使用十进制数据类型,例如decimal32,decimal64或?decimal128

4

5 回答 5

31

并非所有编译器都实现了Decimal TR中的类。一些编译器,例如gcc,实现了C Decimal TR并在 C++ 中提供了相应的扩展。过去有一个可用的 C++ Decimal TR 的开源实现,但我找不到它。如果您的编译器不支持小数类型,那么您最好的选择可能是为 IBM 的decNumber library创建一个包装器。

为了改善 C++ 未来的情况,我制定了更新 TR 的计划,我将把当前的 TR 变成一个完整的提案,为下一次 C++ 委员会会议(4 月在布里斯托尔)准备,试图获得它被纳入 C++ 标准,可能会被纳入 2014 年计划的修订版。我的实现是我日常工作的一部分,我无法决定它是否可以公开提供,尽管有一些希望可以在某个时候开源。

于 2012-12-31T00:12:30.133 回答
17

您可以使用易于使用的带有模板的 C++ 仅标头解决方案: https ://github.com/vpiotr/decimal_for_cpp

请注意,这不是*Big *Decimal 类;它仅限于 64 位的“尾数”数字。

[取自链接]

  #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"
于 2013-06-22T18:10:39.050 回答
4

使用 int32 或 int64,并(手动)将小数点移动到您想要的位置。例如,如果您正在测量美元,只需测量美分并以不同的方式显示值。简单的!

于 2012-12-31T00:27:33.870 回答
1

Boost 也有 cpp_dec_float。在标准被采用之前,这可能是最好的解决方案。

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

编辑:该库在实现中使用浮点值,因此不是真正的十进制数学库 IMO。

于 2018-10-27T18:40:23.340 回答
0

gcc/clang(通常)带有它们自己的浮点十进制实现,如果您的发行版决定将它们编译成它们提供的任何 gcc/clang 版本(对于我尝试过的某些 arm 发行版来说不是这种情况)。这就是您有时需要自定义十进制类型实现的原因。试试的想法(在 i586 上一直测试到 aarch64)。

于 2019-01-08T05:13:36.490 回答