我对向 Visual Studio (2013) 添加附加库以及处理某些事物(例如金钱)时浮点数和双精度数通常不够准确的想法相当陌生。我最初认为 BOOST::Multi precision 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)