在.net中,我如何选择Decimal和Double
我们前几天在工作中讨论这个问题,我希望有一个Stackoverflow问题,我会指出人们在这里如此。)
Double
和Decimal
什么区别? 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