有没有一个相当于Java的BigDecimal的C ++?

我正在寻找一个可以做十进制浮点运算的C ++类。 通过http://speleotrove.com/decimal/浏览 ,有人写的各种类的链接,而不是维护。 挖掘decNumber ++的东西让我看到一些电子邮件,显示GCC最终会支持这个function。 (正式称为ISO / IEC TR 24733)

我正在寻找一些我可以用来替代float或double的东西,这是其他人在自己的项目中使用的东西。 希望开源。

谢谢!

编辑:我应该指出,我试图用这个来表示价格。 所以我需要EXACT小数,而不是大数小数。

有一个巨大的库称为GMP(GNU多精度库) ,它支持这一点,也有C + +绑定,但老实说,C + +接口有点过时了。

从文档中的一个例子,下面创build一个名为f的float,其精度至less为500位:

 mpf_class f(1.5, 500); 

如果你需要使用十进制数值进行操作,我build议你使用http://gmplib.org/库。; 我已经用了很多C和C ++。

问题是有点老,但对于其他人有相同的需求:Boost.multiprecision可能是你在找什么。

http://www.boost.org/doc/libs/1_57_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html

这是一个任意的精度库,可以处理10位小数。

使用GMP并将一切存储为美分。 如果你知道你不会通过2 ^ 32美分(42949673万美元)使用32位无符号整数(或使用64位无符号整数),并保持简单。

可能是“MAPM,C中的便携式任意精度math库”是你正在寻找的。 它还包括C ++包装器:

http://www.tc.umn.edu/~ringx004/mapm-main.html

我可能为时太晚,但将128位小数的工作? 这些已经被C ++所接受,至lessgcc自从gcc-4.5(我们现在开始4.9:

 #include <iostream> #include <decimal/decimal> using namespace std; int main() { { std::decimal::decimal32 dn(.3), dn2(.099), dn3(1000), dn4(201); dn-=dn2; dn*=dn3; cout << "decimal32 = " << (dn==dn4) << " : " << decimal32_to_double(dn) << endl; } { std::decimal::decimal64 dn(.3), dn2(.099), dn3(1000), dn4(201); dn-=dn2; dn*=dn3; cout << "decimal64 = " << (dn==dn4) << " : " << decimal64_to_double(dn) << endl; } { std::decimal::decimal128 dn(.3), dn2(.099), dn3(1000), dn4(201); dn-=dn2; dn*=dn3; cout << "decimal128 = " << (dn==dn4) << " : " << decimal128_to_double(dn) << endl; } return 0; } 

请注意,decimal32的大小等于float,decimal64的大小等于最大的double。 所以decimal128是相当大的。 Decimal128支持有效数字的34位十进制数和-6143到+6144的指数范围,即±0.000000000000000000000000000000000×10-6143到±9.999999999999999999999999999999999×106144。 (相当于±0000000000000000000000000000000000×10-6176〜±9999999999999999999999999999999999×106111。)

mpfr库是任意精度二进制浮点 – 不是任意的精度小数。 有一个区别。

这里是BCMath PHP到C ++的实现。 有两个版本,一个用于Qt,另一个仅用于STL。

来源: https : //github.com/DesarrollosCuado/BCMath-for-Cpp

 BCMath::bcscale(4); //Num Decimals BCMath test("-5978"); test^=30; //Pow, only integers. Not work decimals. std::cout<<"Result BigDecimal 1: "<<test.toString().c_str()<<std::endl; test-=1.23; //sub std::cout<<"Result BigDecimal 2: "<<test.toString().c_str()<<std::endl; test*=1.23; //mul std::cout<<"Result BigDecimal 3: "<<test.toString().c_str()<<std::endl; test*=-1.23; //mul std::cout<<"Result BigDecimal 4: "<<test.toString().c_str()<<std::endl; BCMath::bcscale(70); //Num Decimals BCMath randNum("-5943534512345234545.8998928392839247844353457"); BCMath pi("3.1415926535897932384626433832795028841971693993751058209749445923078164062862"); BCMath result1 = randNum + pi; BCMath result2 = randNum - pi; BCMath result3 = randNum * pi; BCMath result4 = randNum / pi; std::cout<<"Result Super Precision 1: "<<result1.toString().c_str()<<std::endl; std::cout<<"Result Super Precision 2: "<<result2.toString().c_str()<<std::endl; std::cout<<"Result Super Precision 3: "<<result3.toString().c_str()<<std::endl; std::cout<<"Result Super Precision 4: "<<result4.toString().c_str()<<std::endl; //Other example BCMath::bcscale(4); //Num Decimals std::cout<<"Other 1: "<<BCMath::bcmul("1000000.0134", "8.0234").c_str()<<std::endl; std::cout<<"Other 2: "<<BCMath::bcadd("1000000.0134", "8.0234").c_str()<<std::endl; std::cout<<"Compare 1: "<<BCMath::bccomp("1", "2")<<std::endl; std::cout<<"Compare 2: "<<BCMath::bccomp("1.00001", "1", 3)<<std::endl; std::cout<<"Compare 3: "<<BCMath::bccomp("1.00001", "1", 5)<<std::endl; std::cout<<"Compare 4: "<<(BCMath("1")< BCMath("2"))<<std::endl; std::cout<<"Compare 5: "<<(BCMath("1")<=BCMath("2"))<<std::endl; std::cout<<"Compare 6: "<<(BCMath("1")> BCMath("2"))<<std::endl; std::cout<<"Compare 7: "<<(BCMath("1")>=BCMath("2"))<<std::endl; std::cout<<"Compare 8: "<<(BCMath("2")< BCMath("2"))<<std::endl; std::cout<<"Compare 9: "<<(BCMath("2")<=BCMath("2"))<<std::endl; std::cout<<"Compare 10: "<<(BCMath("2")> BCMath("2"))<<std::endl; std::cout<<"Compare 11: "<<(BCMath("2")>=BCMath("2"))<<std::endl; std::cout<<"Round 1: "<<BCMath::bcround("123.01254").c_str()<<std::endl; std::cout<<"Round 2: "<<BCMath::bcround("-123.01254", 3).c_str()<<std::endl; std::cout<<"Round 3: "<<BCMath::bcround("123.01254", 2).c_str()<<std::endl; pi.round(3); std::cout<<"Round 4: "<<pi.toString().c_str()<<std::endl; BCMath part1("-.123"); BCMath part2(".123"); BCMath part3("123"); std::cout<<"Int part 1: "<<part1.getIntPart().c_str()<<std::endl; std::cout<<"Dec part 1: "<<part1.getDecPart().c_str()<<std::endl; std::cout<<"Int part 2: "<<part2.getIntPart().c_str()<<std::endl; std::cout<<"Dec part 2: "<<part2.getDecPart().c_str()<<std::endl; std::cout<<"Int part 3: "<<part3.getIntPart().c_str()<<std::endl; std::cout<<"Dec part 3: "<<part3.getDecPart().c_str()<<std::endl; 

结果:

 Result BigDecimal 1: 198005530669253749533290222782634796336450786581284861381777714804795900171726938603997395193921984842256586113024 Result BigDecimal 2: 198005530669253749533290222782634796336450786581284861381777714804795900171726938603997395193921984842256586113022.7700 Result BigDecimal 3: 243546802723182111925946974022640799493834467494980379499586589209898957211224134482916796088524041355975600919018.0071 Result BigDecimal 4: -299562567349513997668914778047848183377416395018825866784491504728175717369805685413987659188884570867849989130392.1487 Result Super Precision 1: -5943534512345234542.7583001856941315459727023167204971158028306006248941790250554076921835 Result Super Precision 2: -5943534512345234549.0414854928737180228979890832795028841971693993751058209749445923078164 Result Super Precision 3: -18672164360341183116.9114783895073349180904753962992796943871920962352436079118338887287186 Result Super Precision 4: -1891885794154043400.2804849527556211973567525043250278948318788149660700494315139982452600 Other 1: 8023400.1075 Other 2: 1000008.0368 Compare 1: -1 Compare 2: 0 Compare 3: 1 Compare 4: true Compare 5: true Compare 6: false Compare 7: false Compare 8: false Compare 9: true Compare 10: false Compare 11: true Round 1: 123.0125 Round 2: -123.013 Round 3: 123.01 Round 4: 3.142 Int part 1: -0 Dec part 1: 123 Int part 2: 0 Dec part 2: 123 Int part 3: 123 Dec part 3: 0