在 .net 中,如何在十进制和双精度之间进行选择
Posted
技术标签:
【中文标题】在 .net 中,如何在十进制和双精度之间进行选择【英文标题】:In .net, how do I choose between a Decimal and a Double 【发布时间】:2011-02-02 11:40:00 【问题描述】:我们前几天在工作中讨论过这个问题,我希望有一个 *** 问题我会向人们指出,所以就这样吧。)
Double
和 Decimal
有什么区别?
您应该在什么时候(在什么情况下)始终使用Double
?
您应该在什么时候(在什么情况下)始终使用Decimal
?
在不属于上述两个阵营之一的情况下,需要考虑的驱动因素是什么?
有很多问题与这个问题重叠,但它们往往是在询问某人在特定情况下应该做什么,而不是在一般情况下如何决定。
【问题讨论】:
另见***.com/questions/803225/…,不过这里主要讨论的是植入细节,而不是“为什么” Difference between decimal, float and double in .NET?的可能重复 【参考方案1】:如果您想保持真正的精度,请使用 十进制
如果要比较值,请保留 十进制
如果你使用 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;
会产生这个,double会失去一些精度
?豆 0.0000000018446744078004519 ?十二月 0.0000000018446744078004518913D
最后,
double = 近似值
十进制 = 真实的
【讨论】:
定义“真正的精度”...记住 1m 除以 3 的结果。 你是说小数是双精度的,就像双精度是浮点数一样? @Ian - 他说用小数表示金钱,用双倍表示近似值,为什么人们要偷偷摸摸? +1 弗雷杜 @Fredou:所以在 1/3 的情况下,您仍然会丢失带有小数的信息。同样,您能否定义“真正的精度”是什么意思? Ian 的评论是正确的 - 我已经知道双精度和小数的行为,但是小数给您“真正的精度”的想法对于任何直观的“真正的精度”概念都是误导性的。【参考方案2】:我通常会考虑 自然 与 人造 的数量。
自然量是指体重、身高和时间。这些永远不会绝对准确地测量,并且很少有绝对精确的算术概念:您通常不应该将高度相加,然后确保结果完全符合预期。对于这种数量,请使用double
。双打的范围很大,但精度有限;它们也非常快。
占主导地位的人造数量是金钱。有“正好 10.52 美元”这样的东西,如果你加上 48 美分,你预计正好有 11 美元。对于这种数量,请使用decimal
。理由:考虑到一开始是人为的,所涉及的数字也是人为的,旨在满足人类的需求——这意味着它们自然地以 10 为基数表示。使存储表示与人类表示相匹配。 decimal
没有double
的范围,但大多数人工量也不需要那个额外的范围。它也比double
慢,但我个人有一个银行账户,它给我的正确答案比错误答案快:)
如需更多信息,我有关于 .NET binary floating point types 和 .NET decimal type 的文章。 (请注意,decimal
也是浮点类型 - 但有问题的“点”是小数点,而不是二进制点。)
【讨论】:
“它也比十进制慢,但我个人有一个银行账户”... - 我相信你想说“它也比 double 慢”: )【参考方案3】:SQL 服务器 还值得一提的是,SQL Server 中的小数映射到 .net 框架中的小数和可空小数。而 sql server 中的 float 映射到 Double 和 Nullable Double。以防万一您最终处理的是数据库应用程序。
甲骨文 我不再使用 oracle,因为您可以在我的个人资料信息中看到它已被划掉 :),但是对于那些使用 oracle 的人来说,这里有一篇 MSDN 文章映射 oracle 数据类型:
http://msdn.microsoft.com/en-us/library/yk72thhd(VS.80).aspx
【讨论】:
+1,但是当从 .net 使用 oracle 时,请展开以解释它在 oracle 中的工作原理以上是关于在 .net 中,如何在十进制和双精度之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章