【问题标题】:to compare double and decimal should I cast double to decimal or decimal to double?比较双精度和十进制我应该将双精度转换为十进制还是将十进制转换为双精度?
【发布时间】:2012-05-16 04:50:46
【问题描述】:

我需要比较两个值。 一个值是price,它代表某物的当前价格,因此decimal,因为您实际上可以按此价格买卖某物。

另一个值是estimatedPrice,它是数学计算的结果,所以double,因为它只是estimation,你实际上不能通过这个esitmatedPrice做任何“操作”

现在我想购买price < estimatedPrice

那么我应该将价格转换为双倍还是将估计价格转换为小数?

我知道在施法后我会得到“稍微其他”的数字,但我似乎没有其他选择。

【问题讨论】:

  • @BlueChippy 如果商品价格昂贵,您不能将浮动用于价格数据。例如,float 不能代表123456.78
  • 十进制占用更多内存并且具有更小范围的更重要的数字,因此与浮点数(float/double)相比可以“更精确”(取决于您对“精确”的看法)。如果你愿意,你可以很高兴地对两个值使用双精度,或者小数,或者浮点数,特别是如果价格总是要保留两位小数。您不能将任何浮点数显式转换为十进制数(因为它们是完全不同的东西),因此在这种情况下最好为所有类型选择一个。将留给其他人推荐哪一个! (我个人会使用小数)
  • @phoog 是的,取决于场景。我的个人偏好是十进制(首选)或双精度...但如果可能,请全面使用该类型。
  • @BlueChippy 同意了。实际上,我对浮点数发表了评论,因为我什至见过货币价值超过 double 范围的情况。但是,自从意大利使用欧元和土耳其将其货币重新估价 10^6 倍后,我还没有看到过这种情况。

标签: c#


【解决方案1】:

这取决于数据。十进制具有更高的精度; double 的范围更大。如果双精度值可能超出小数范围,则应将小数转换为双精度(或者,如果双精度值超出小数范围,则实际上您可以编写一个返回结果而不进行转换的方法;请参见下面的示例)。

在这种情况下,双精度值似乎不太可能超出小数范围,因此(特别是因为您正在处理价格数据)您应该将双精度值转换为小数。

示例(可以使用一些逻辑来处理 NaN 值):

private static int Compare(double d, decimal m)
{
    const double decimalMin = (double)decimal.MinValue;
    const double decimalMax = (double)decimal.MaxValue;
    if (d < decimalMin) return -1;
    if (d > decimalMax) return 1;
    return ((decimal)d).CompareTo(m);
}

【讨论】:

  • int 结果 = 比较(9223372036854775800.0, 9223372036854780000); // 输出 0,但数字不相等。
  • @Loathing 那太可怕了。
【解决方案2】:

decimal vs double! - Which one should I use and when?

如果您更关心精度,请转换为十进制。如果不是,请选择双打。

【讨论】:

    【解决方案3】:

    我以前从未在软件中处理过价格问题,但据我所知,很多都处理整数。例如,对于 $1.23,将其存储为整数 123。当您将结果输出给用户时,会在最后完成转换为小数。

    同样,对于您的估计价格,您能否处理(比方说)大 100 倍的数字?

    【讨论】:

    • 这可能是一个很好的优化,但是现在我应该将双精度转换为十进制或将十进制转换为双精度。另外我猜可能decimal 在内部使用int,所以使用decimal 来定价会更容易。
    【解决方案4】:

    我建议您转换为十进制。因为您似乎想要操纵货币价值。但我可以给出这个简短的答案:为了准确(专门为金融应用程序操纵货币价值)应用程序使用小数。如果您喜欢更少的资源和更快的速度,请使用 double。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2011-07-31
      • 1970-01-01
      • 2017-02-27
      相关资源
      最近更新 更多