【问题标题】:Store price in double?店铺价格翻倍?
【发布时间】:2014-04-21 07:54:08
【问题描述】:

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

【问题讨论】:

标签: c++ decimal


【解决方案1】:

如果价格范围合适(可能是),您可以使用long long,在最后两位数字前添加一个隐含的点。因此,12000 将意味着 120.00。它被称为“定点”算术。但是您需要处理两个货币值的乘法(为什么还需要它)。

【讨论】:

  • 不,两种货币相乘会得出错误的结果:100*100=10000。现在你需要在点之后的四位数字。但我知道这是一种罕见的情况。大多数情况下,您只需将货币乘以无单位数量即可。
【解决方案2】:

您可以查看Intel® Decimal Floating-Point Math Library 了解存储价格。您还可以查看非常有用的Boost.Multiprecision library,您可以使用名为cpp_dec_float

的基于十进制的浮点模板类

【讨论】:

    【解决方案3】:

    我很想使用intunsigned int 以您关心的货币的最小比例来计算商店价格。因此,如果一件商品的价格为 5.99 美元,并且您不跟踪小于 1 美分的价值,请将其存储在 int 中,如 599

    【讨论】:

      【解决方案4】:

      不幸的是,您在 C++ 中遇到的问题与其他任何地方一样。你不能相信double 能够正确存储这些值,尽管它比float 好得多。

      C++ 中没有像 Decimal 这样的数据结构,所以你要么需要寻找一个库来为你做这件事,要么你使用其他格式。

      一个简单的解决方案是将值 "42.37" 存储为 "4237" - 这就是您可以信任您的值的方式。但如果您使用这个数字进行计算,我仍然建议您使用双精度数。

      如果您决定使用更大的变量类型,例如 long double,您可以减少出错的可能性 - 但不能保证。

      【讨论】:

        【解决方案5】:

        您可以使用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;
        }
        

        【讨论】:

          【解决方案6】:

          取决于您需要的准确性。如果您要使用5.259.14 等数字,您甚至不需要doublefloat 就足够了。

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

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

          【讨论】:

          • 问题是,浮点数和双精度值不能精确地存储所有十进制数。如果您尝试存储“0.1 dec”,它将变为“0.0001100110011001100110...bin”。如果将其转换回来,则为“0.09999 ... dec”。当您使用此类数字进行计算时,这可能会导致问题。使用更大的类型可以减少此类问题的可能性,但并不能保证它可以正常工作。
          • @maja:是的。我很清楚ponies。但即使这样,四舍五入也可以。
          【解决方案7】:

          来自多年的ERP开发经验……

          除整数(intlonglong intint64 等)以外,切勿将价格存储为隐含小数位的数量函数(即将 4.00 美元存储为 400)

          一个例子。想想产品的价格突破。

          1. 1 美元 1 件 --- 单价 1 美元
          2. 25 个,13.33 美元 --- 单价 0.393939393939 美元,永远重复。

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

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

          【讨论】:

            猜你喜欢
            • 2013-04-10
            • 1970-01-01
            • 2018-10-31
            • 1970-01-01
            • 1970-01-01
            • 2017-04-13
            • 2018-12-08
            • 2020-02-03
            • 2014-05-31
            相关资源
            最近更新 更多