我们前几天正在讨论这个问题,我希望有一个Stackoverflow问题,我会指点人们这样做。)
有很多问题与这个问题重叠,但他们倾向于询问某个人在特定情况下应该做些什么,而不是在一般情况下如何做出决定。
答案 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