商店价格是双倍的吗? 在C++中,双变量的价格是否安全?在C#和Java中,可以使用十进制。(他们还说,将价格存储为双倍是个坏主意)。在C++中,我应该做什么?

商店价格是双倍的吗? 在C++中,双变量的价格是否安全?在C#和Java中,可以使用十进制。(他们还说,将价格存储为双倍是个坏主意)。在C++中,我应该做什么?,c++,decimal,C++,Decimal,你可以查看一下存储价格。你也可以检查哪些非常有用,你可以使用十进制浮点模板类,叫做 < p>不幸的是,C++和其他任何地方都有相同的问题。您不能信任double来正确存储值,尽管它比float好得多 < >没有数据结构,如代码>十进制< /代码>可在C++中使用,因此您需要查找一个为您做此的库,您使用其他格式。 一个简单的解决方案是,将值“42.37”存储为“4237”——这就是您可以信任您的值的方式。但如果你用这个数字计算的话,我还是建议你用double 如果您决定使用更大的变量类型,如l

你可以查看一下存储价格。你也可以检查哪些非常有用,你可以使用十进制浮点模板类,叫做<强> <强>

< p>不幸的是,C++和其他任何地方都有相同的问题。您不能信任
double
来正确存储值,尽管它比
float
好得多

< >没有数据结构,如代码>十进制< /代码>可在C++中使用,因此您需要查找一个为您做此的库,您使用其他格式。

一个简单的解决方案是,将值
“42.37”
存储为
“4237”
——这就是您可以信任您的值的方式。但如果你用这个数字计算的话,我还是建议你用double


如果您决定使用更大的变量类型,如
long double
,您可以降低出错的可能性,但这并不能保证这一点。

如果价格范围合适(可能合适),您可以使用
long long
,在最后两位数字之前加上一个暗点。因此,12000意味着120.00。这叫做“定点”算法。但是你需要注意两个货币值的乘法(为什么你还需要它)。

我很想用你所关心的使用
int
无符号int
的货币的最小部分来存储价格。因此,如果一件物品的价格为5.99美元,而您跟踪的值不小于1美分,请将其存储在
int
中,因为
599

取决于您所需的准确性。如果要处理像
5.25
9.14
等数字,甚至不需要使用
双精度
<代码>浮动就足够了

如果您要处理帐户余额,并将
0.01%
添加到像
18 570.548911545
这样的数字中,则
双精度
提供的15位小数就足够了


如果需要更高的精度,请选择长双精度。如果这还不够的话,那就寻找“更精确的替代品”

你可以使用
长双精度
来存储价格

// 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;
}
//获取金钱操纵器示例
#包括//标准::cin,标准::cout
#包括//标准::获取金钱
int main()
{
多倍价格;
std::cout>std::获得金钱(价格);

如果(std::cin.fail())std::cout来自多年的ERP开发经验

除了整数(
int
long
long int
int64
等)以外,不得将定价存储为数量的函数,并带有隐含的小数位数(即将$4.00存储为400)

举个例子,想想一个产品的价格折扣

  • 数量为1美元——单价为1美元
  • 数量25,价格13.33美元——单价0.3939美元,永远重复
  • 将第2行的单位存储在
    double
    中会导致四舍五入。与其存储为
    double
    ,不如为price
    1333
    设置一个
    int
    变量,为quantity
    25
    设置一个
    int
    变量,并在需要显示时计算该单价


    当存储为
    double
    float
    等时,在将十进制值转换为二进制值时,您总是有舍入/丢失精度的风险。

    浮点值如何?为什么这是一个坏主意?小数部分需要多少位十进制数字?它是变化的还是固定的?另请参见,因为除非您处理的是会计系统,以及拥有多个百分比的乘法运算。双精度运算太过了,上一次肯定是个坏主意。但随着时间的推移,双精度运算对大多数计算机系统来说都不算什么。相关阅读是本文的问题是,浮点值和双精度值不能精确存储所有十进制数。如果你试图存储“0.1 dec”,它就变成了“0.00011001100110…bin”。如果将其转换回,则为“0.09999…dec”"。当你用这些数字计算时,这可能会导致一个问题。使用较大的类型可以减少出现此类问题的可能性,但不能保证它能正常工作。@maja:是的。我很清楚。但即使这样,舍入也可以。不,两种货币相乘会得到错误的结果:100*100=10000。现在你需要四位数点。但我知道这是一种罕见的情况。大多数情况下,你只是将一种货币乘以一个无单位的数量。