C++ 十进制算术库

C++ decimal arithmetic libraries

我对向 Visual Studio (2013) 添加额外的库以及处理某些事情(如金钱)时浮点数和双精度数通常不够准确的想法还很陌生。我最初认为 BOOST::Multiprecision cpp_dec_float 可以解决这个问题,但在我测试它时,我注意到了一些不寻常的事情,并意识到我可能是错的。例如,

cpp_dec_float_50 decimal = 0.45;
double dbl = 0.45; //for comparison

cout << fixed << setprecision(50) << "boost:    " << decimal << endl;
cout << "double:  " << dbl << endl;

会给出这样的结果

boost:    0.45000000000000001110223024625156540423631668090820
double:   0.45000000000000001000000000000000000000000000000000

而不是我预期的 (0.45000000000000000000000000000000000000000000000000)。

这不会比仅使用浮点数或双精度数更准确吗?如果不是,我假设我刚刚链接到我的 VS2013 的 boost 库具有任意整数类型,这可以接受吗?我唯一不喜欢将整数用于此类事情的是,在将利率与货币相乘之前,我可能必须将利率转换为整数,这可能会导致非常非常大的数字,这可能会或可能不会导致性能问题。

(假设 BOOST 不是我需要的)您对英特尔的十进制浮点库有何看法?我无法让它工作(还)所以我想知道它是否值得付出努力。还有其他类似的库值得一试吗?

因此,您正在为十进制变量分配一个数字(已经是浮点数)。所以你关心的错误已经介绍了。

相反,让我们为它分配一个包含正确数字的字符串:

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
using namespace std;
using boost::multiprecision::cpp_dec_float_50;

int main() {
    cpp_dec_float_50 decimal("0.45");
    double dbl = 0.45; //for comparison

    cout << fixed << setprecision(50) << "boost:   " << decimal << endl;
    cout << "double:  " << dbl << endl;
}

输出:

boost:   0.45000000000000000000000000000000000000000000000000
double:  0.45000000000000001110223024625156540423631668090820

使用Python:

import decimal

d = decimal.Decimal("0.45")

print(d)

输出 0.45。