在.net中,如何在Decimal和Double之间进行选择

时间:2010-03-30 13:33:24

标签: .net floating-point

我们前几天正在讨论这个问题,我希望有一个Stackoverflow问题,我会指点人们这样做。)

  • DoubleDecimal之间的区别是什么?
  • 何时(在何种情况下)总是使用Double
  • 何时(在何种情况下)总是使用Decimal
  • 在不属于上述两个阵营之一的情况下,需要考虑的驱动因素是什么?

有很多问题与这个问题重叠,但他们倾向于询问某个人在特定情况下应该做些什么,而不是在一般情况下如何做出决定。

3 个答案:

答案 0 :(得分:36)

我通常会考虑自然 vs 人工数量。

自然数量就像体重,身高和时间。这些永远不会被绝对准确地测量,并且很少有关于它的绝对精确算术的想法:你通常不应该加起来,然后确保结果完全符合预期。使用double表示此类数量。双打范围很广,但精度有限;他们也非常快。

主要的人为数量是金钱。有一个“确切的10.52美元”的东西,如果你加48美分,你期望有11美元。使用decimal表示此类数量。理由:鉴于它起初是人为的,所涉及的数字也是人为的,旨在满足人类需求 - 这意味着它们在基数10中自然表达。使存储表示与人类表示相匹配。 decimal的范围不是double,但大多数人工数量也不需要额外的范围。它也比double慢,但我个人有一个银行账户,它给了我正确的答案,而不是一个错误的答案:)

有关更多信息,我的文章有.NET binary floating point types.NET decimal type。 (请注意,decimal也是浮点类型 - 但所讨论的“点”是小数点,而不是二进制点。)

答案 1 :(得分:6)

如果你想保持真正的精确度,请坚持十进制

如果您想比较值,请使用十进制

如果您使用 double 并执行此操作

? ctype(1.0, Double ) / 3

你会得到

  

0.33333333333333331

如果您使用十进制并执行此操作

? ctype(1.0, Decimal ) /3

你会得到

  

0.3333333333333333333333333333D

还有一个例子,极端的一个;

  decimal dec = new decimal(1, 1, 1, false, 28);
  var dou = (double)dec;

会产生这个,双倍会失去一些精确度

  

?斗
  0.0000000018446744078004519
  ?十二月
  0.0000000018446744078004518913D

最后,

double =近似值

十进制 =真实的东西

答案 2 :(得分:1)

SQL Server 还值得一提的是,SQL Server中的十进制映射到.net框架中的Decimal和Nullable Decimal。而在sql server中的float映射到Double和Nullable Double。以防万一你最终处理数据库应用程序。

<强>的Oracle 我不再使用oracle,因为你可以看到它在我的个人资料信息中被删除:),但对于那些使用oracle的人来说,这是一篇映射oracle数据类型的MSDN文章:

http://msdn.microsoft.com/en-us/library/yk72thhd(VS.80).aspx