问题 要比较double和decimal,我应该将double转换为十进制或十进制来加倍?


我需要比较两个值。 一个值是 price 这代表某物的当前价格等等 decimal 因为你实际上可以用这个价格购买或出售东西。

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

现在我想买 price < estimatedPrice

那么我应该将价格加倍或估计价格为十进制吗?

据我所知,在施法后我会得到“轻微的另一个”数字,但似乎我没有其他选择。


12014
2018-05-16 04:50


起源

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


答案:


这取决于数据。十进制具有更高的精度;双倍有更大的范围。如果double可以在十进制范围之外,你应该将十进制转换为double(或者你实际上可以编写一个返回结果而不进行转换的方法,如果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);
}

11
2018-05-16 05:03





十进制vs双! - 我应该使用哪一个?何时使用?

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


3
2018-05-16 04:54





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


1
2018-05-16 05:07





我以前从未在软件中使用过价格,但从我所听到的情况来看,很多都是关于整数的。例如,对于$ 1.23,将其存储为整数123.当您将结果输出给用户时,将在最后完成到小数的转换。

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


0
2018-05-16 04:59



这可能是一个很好的优化,但是现在我应该将double转换为十进制或十进制转换为double。我猜也许 decimal 内部使用 int 所以它更容易使用 decimal 价格。 - javapowered