商店价格是双倍?

时间:2014-04-21 07:54:08

标签: c++ decimal

在C ++中将价格存储在双变量中是否安全?在C#和Java中,您可以使用Decimal。 (他们还说,以两倍的价格存储价格非常坏主意)。我该怎么做C ++?

7 个答案:

答案 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)

我会根据您使用intunsigned 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.259.14等数字,则甚至不需要doublefloat就足够了。

如果您要使用帐户余额并将0.01%添加到18 570.548911545之类的数字,那么double提供的15位十进制数字的精度就足够了。

如果您需要稍高的精度,请转到long double。如果这还不够,那么只有寻找“更精确的替代方案”。

答案 6 :(得分:0)

基于多年的ERP开发经验...

永远不要将价格(除整数(intlonglong intint64等之外)存储为带有隐含小数位的数量(即存储) $ 4.00为400)

一个例子。考虑一下产品的价格下跌。

  1. 1美元的数量1 ---单价1美元
  2. 数量25为$ 13.33 ---价格$ .393939393939永远重复

将第2行的单位存储在double中将导致舍入。与其以double的形式存储,不如为价格int设置一个1333变量,为数量25设置一个变量,并在需要显示时计算该单价。

当存储为doublefloat等时,在将十进制值转换为二进制值时始终会舍入/舍入精度。