代码之家  ›  专栏  ›  技术社区  ›  Ian Ringrose

在.NET中,如何在十进制和双进制之间进行选择

  •  18
  • Ian Ringrose  · 技术社区  · 15 年前

    前几天我们在工作中讨论过这个问题,我希望有一个stackoverflow问题,我会把人们引向这里,所以这里是。)

    • 这两者的区别是什么 Double 和A Decimal ?
    • 你什么时候(在什么情况下)应该 总是 使用 双重的 ?
    • 你什么时候(在什么情况下)应该 总是 使用A 十进制的 ?
    • 什么是 需要考虑的驱动因素 以防落入上述两个阵营之一?

    有很多问题与这个问题重叠,但它们往往是在问一个人在特定情况下应该做什么,而不是在一般情况下如何决定。

    3 回复  |  直到 13 年前
        1
  •  36
  •   Jon Skeet    15 年前

    我经常想 自然的 VS 人造的 量。

    自然量是指体重、身高和时间。这些永远不会被绝对精确地测量,也很少有绝对精确的算法在上面:你通常不应该把高度加起来,然后确保结果完全符合预期。使用 double 对于这种数量。双打的射程很大,但精度有限;速度也非常快。

    主要的人为数量是货币。有这样一个东西“正好10.52美元”,如果你加上48美分,你期望有正好11美元。使用 decimal 对于这种数量。理由:考虑到一开始是人为的,所涉及的数字也是人为的,旨在满足人类的需求——这意味着它们自然地以基数10表示。使存储表示与人类表示匹配。 十进制的 没有范围 双重的 ,但大多数人工数量也不需要额外的范围。它也比 双重的 ,但我个人会有一个银行账户,它给我正确答案的速度慢于给我错误答案的速度快:)

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

        2
  •  6
  •   Fredou    15 年前

    如果你想保持精确 十进制的

    如果你想比较价值 十进制的

    如果你使用 双重的 这样做

    ? ctype(1.0, Double ) / 3
    

    你会得到

    0.33333333333333331

    如果你使用 十进制的 这样做

    ? ctype(1.0, Decimal ) /3
    

    你会得到

    0.33333333333333333333333333三维

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

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

    会产生这个,Double会失去一些精确性

    ?窦
    0.0000000018446744078004519
    ?12月
    0.0000000018446744078004518913D

    最后,

    双重的 =近似值

    十进制的 真实的事物

        3
  •  1
  •   JonH    15 年前

    SQL Server 值得一提的是,SQL Server中的decimal映射到.NET框架中的decimal和nullable decimal。而SQL Server中的float映射为double和nullable double。以防你最终处理一个数据库应用程序。

    甲骨文公司 我不再使用Oracle,因为您可以在我的配置文件信息中看到它被划掉了:),但是对于那些使用Oracle的人,这里有一篇映射Oracle数据类型的MSDN文章:

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

    推荐文章