在C ++中将价格存储在双变量中是否安全?在C#和Java中,您可以使用Decimal。 (他们还说,以两倍的价格存储价格非常坏主意)。我该怎么做C ++?
答案 0 :(得分:5)
如果价格范围合适(可能是这样),您可以在最后两位数之前使用隐含点的long long
。所以,12000将意味着120.00。它被称为“定点”算术。但是你需要处理两个货币值的乘法(无论如何你还需要它)。
答案 1 :(得分:2)
您可以查看Intel® Decimal Floating-Point Math Library来存储价格。您也可以查看Boost.Multiprecision library哪个非常有用,您可以使用名为 cpp_dec_float
的基于十进制的浮点模板类答案 2 :(得分:2)
不幸的是,你在C ++中遇到的问题和其他地方一样。您不能信任double
来正确存储值,尽管它比float
要好得多。
在C ++中没有类似Decimal
的数据结构,所以你需要找一个为你做这个的库,你使用其他格式。
一个简单的解决方案是,将值"42.37"
存储为"4237"
- 这就是您可以信任您的价值观。但是如果你用这个数字来计算,我仍然建议使用double。
如果您决定使用更大的变量类型,例如long double
,您可以减少出错的可能性 - 但它并不能保证它。
答案 3 :(得分:2)
我会根据您使用int
或unsigned int
关注的最小货币比例来诱惑商店价格。因此,如果某件商品的价格为5.99美元且您没有追踪小于1美分的价值,请将其存储在int
599
中。
答案 4 :(得分:2)
您可以使用long double
存储价格
// get_money manipulator example
#include <iostream> // std::cin, std::cout
#include <iomanip> // std::get_money
int main ()
{
long double price;
std::cout << "Please, enter the price: ";
std::cin >> std::get_money(price);
if (std::cin.fail()) std::cout << "Error reading price\n";
else std::cout << "The price entered is: " << price << '\n';
return 0;
}
答案 5 :(得分:1)
取决于您需要的准确性。如果您要处理5.25
,9.14
等数字,则甚至不需要double
。 float
就足够了。
如果您要使用帐户余额并将0.01%
添加到18 570.548911545
之类的数字,那么double
提供的15位十进制数字的精度就足够了。
如果您需要稍高的精度,请转到long double
。如果这还不够,那么只有寻找“更精确的替代方案”。
答案 6 :(得分:0)
基于多年的ERP开发经验...
永远不要将价格(除整数(int
,long
,long int
,int64
等之外)存储为带有隐含小数位的数量(即存储) $ 4.00为400)
一个例子。考虑一下产品的价格下跌。
将第2行的单位存储在double
中将导致舍入。与其以double
的形式存储,不如为价格int
设置一个1333
变量,为数量25
设置一个变量,并在需要显示时计算该单价。
当存储为double
,float
等时,在将十进制值转换为二进制值时始终会舍入/舍入精度。