在.net中,我如何选择Decimal和Double

我们前几天在工作中讨论这个问题,我希望有一个Stackoverflow问题,我会指出人们在这里如此。)

  • DoubleDecimal什么区别?
  • 何时(在什么情况下)你应该总是使用Double
  • 何时(在哪些情况下)应该总是使用Decimal
  • 在不属于上述两个阵营之一的情况下, 需要考虑驱动因素是什么?
  • 有很多问题与这个问题重叠,但他们倾向于问某人在某个特定情况下应该做什么,而不是在一般情况下如何决定。


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

    自然数量就像体重,身高和时间。 这些绝对不会被精确地测量,并且很少有关于绝对精确算术的任何想法:您通常不应该加高,然后确保结果与预期完全一致。 对这种数量使用double 。 双打有很大的范围,但精度有限; 他们也非常快。

    主要的人工数量就是金钱。 有“正好10.52美元”这样的东西,如果你增加48美分它,你期望有正好11美元。 这种数量使用decimal 。 理由:假设它是人为的,所涉及的数字也是人为的,旨在满足人的需求 - 这意味着它们自然地以10为基数表示。使存储表示符合人的表示。 decimal不具有double的范围,但大多数人造数量也不需要那个额外的范围。 这也比double慢,但我个人有一个银行帐户,它给了我正确的答案,而不是一个错误的答案很快:)

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


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

    如果你想比较价值,保持十进制

    如果你使用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 =近似值

    十进制 =真实的东西


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

    Oracle不再使用oracle,因为您可以看到它在我的配置文件信息中被删除:),但对于那些在oracle中使用的用户,这里是映射Oracle数据类型的MSDN文章:

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

    链接地址: http://www.djcxy.com/p/48411.html

    上一篇: In .net, how do I choose between a Decimal and a Double

    下一篇: Rounding error in Python with non