C++ 用C+;存储货币值的最佳方法+;

C++ 用C+;存储货币值的最佳方法+;,c++,currency,C++,Currency,我知道,由于舍入错误,浮点不适合存储货币值。在C++中有表示货币的标准方法吗? 我在boost库中查找了一下,没有找到任何关于它的信息。在java中,BigInteger似乎是这样,但是我在C++中找不到等价的东西。我可以编写自己的money类,但如果有测试,我宁愿不这样做。这取决于您对舍入的业务要求。最安全的方法是存储具有所需精度的整数,并知道何时/如何应用舍入。这取决于您对舍入的业务要求。最安全的方法是存储具有所需精度的整数,并知道何时/如何应用舍入。我建议您保留一个以美分为单位的变量,而不

我知道,由于舍入错误,浮点不适合存储货币值。在C++中有表示货币的标准方法吗?
我在boost库中查找了一下,没有找到任何关于它的信息。在java中,BigInteger似乎是这样,但是我在C++中找不到等价的东西。我可以编写自己的money类,但如果有测试,我宁愿不这样做。

这取决于您对舍入的业务要求。最安全的方法是存储具有所需精度的整数,并知道何时/如何应用舍入。

这取决于您对舍入的业务要求。最安全的方法是存储具有所需精度的整数,并知道何时/如何应用舍入。

我建议您保留一个以美分为单位的变量,而不是美元。这将消除舍入误差。以标准美元/美分格式显示它应该是一个视图问题。

我建议您为美分的数量保留一个变量,而不是美元。这将消除舍入误差。以标准美元/美分格式显示它应该是一个视图问题。

在实际金融系统中处理过这一问题后,我可以告诉您,您可能希望使用精度至少为小数点后6位的数字(假设美元)。希望既然你谈论的是货币价值,你就不会在这里失控。有一些建议将十进制类型添加到C++中,但我不知道实际上还有哪些。 <>这里使用的最好的本地C++类型是长双倍。

其他只使用int的方法的问题是,您必须存储的不仅仅是美分。通常,金融交易会乘以非整数值,这会给您带来麻烦,因为将100.25美元换算为10025*0.000123523(例如APR)会导致问题。你最终会在浮点土地上结束,而转换将花费你很多

现在这个问题在大多数简单的情况下都不会发生。我给你举一个确切的例子:

给定数千个货币值,如果将每个值乘以一个百分比,然后将它们相加,那么最终得到的数字将不同于如果没有保留足够的小数位数,则将总数乘以该百分比得到的数字。这在某些情况下可能会奏效,但你通常会很快就被罚下几便士。根据我的一般经验,确保精度保持在小数点后6位(确保剩余精度适用于整数部分)

也要明白,如果你用一种不太精确的方式做数学运算,你用什么类型来存储它并不重要。如果你的数学是在单精度的土地上进行的,那么你是否在双精度的土地上存储它也没关系。您的精度将精确到最不精确的计算



这就是说,如果你只做简单的加法或减法运算,然后存储数字,那么你就没事了,但一旦出现比这更复杂的事情,你就有麻烦了。

在实际的金融系统中解决了这个问题,我可以告诉您,您可能希望使用精度至少为6位小数的数字(假设美元)。希望既然你谈论的是货币价值,你就不会在这里失控。有一些建议将十进制类型添加到C++中,但我不知道实际上还有哪些。 <>这里使用的最好的本地C++类型是长双倍。

其他只使用int的方法的问题是,您必须存储的不仅仅是美分。通常,金融交易会乘以非整数值,这会给您带来麻烦,因为将100.25美元换算为10025*0.000123523(例如APR)会导致问题。你最终会在浮点土地上结束,而转换将花费你很多

现在这个问题在大多数简单的情况下都不会发生。我给你举一个确切的例子:

给定数千个货币值,如果将每个值乘以一个百分比,然后将它们相加,那么最终得到的数字将不同于如果没有保留足够的小数位数,则将总数乘以该百分比得到的数字。这在某些情况下可能会奏效,但你通常会很快就被罚下几便士。根据我的一般经验,确保精度保持在小数点后6位(确保剩余精度适用于整数部分)

也要明白,如果你用一种不太精确的方式做数学运算,你用什么类型来存储它并不重要。如果你的数学是在单精度的土地上进行的,那么你是否在双精度的土地上存储它也没关系。您的精度将精确到最不精确的计算



这就是说,如果你只做简单的加法或减法运算,然后存储数字,那么你就没事了,但一旦出现比这更复杂的事情,你就有麻烦了。

我建议使用长整数以最小面额存储货币(例如,美国货币是美分),如果使用的是十进制货币

非常重要:确保根据实际包含的内容命名所有货币值。(例如:账户余额)这将避免很多问题


(出现这种情况的另一个例子是百分比。如果实际包含不乘以100的比率,则千万不要将值命名为“XXX_percent”)

如果使用十进制货币,我建议使用长整数以最小面额存储货币(例如,美国货币为美分)

非常重要:确保根据实际包含的内容命名所有货币值。(例如:账户余额)
#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_dec_float.hpp>

int main()
{
    float bogus = 1.0 / 3.0;
    boost::multiprecision::cpp_dec_float_50 correct = 1.0 / 3.0;

    std::cout << std::setprecision(16) << std::fixed 
              << "float: " << bogus << std::endl
              << "cpp_dec_float: " << correct << std::endl;
          
    return 0;
}