C ++十进制数据类型

时间:2012-12-31 00:05:37

标签: c++ types floating-point double decimal

有没有办法在我的C ++程序中使用小数据类型,例如decimal32decimal64decimal128

5 个答案:

答案 0 :(得分:26)

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

为了改善C ++未来的情况,我创建了一个plan to update the TR,我将把当前的TR变成一个完整的提案,为下一次C ++委员会会议做准备(4月在布里斯托尔),试图将其纳入C ++标准,可能进入2014年计划的修订版。我的实施是我日常工作的一部分,我不应该决定它是否可以公开发布,尽管有一些希望它可以在某个时候开源。

答案 1 :(得分:14)

您可以使用易于使用的带有模板的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"

答案 2 :(得分:4)

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

答案 3 :(得分: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

答案 4 :(得分:0)

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