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

Posted

技术标签:

【中文标题】在 .net 中,如何在十进制和双精度之间进行选择【英文标题】:In .net, how do I choose between a Decimal and a Double 【发布时间】:2011-02-02 11:40:00 【问题描述】:

我们前几天在工作中讨论过这个问题,我希望有一个 *** 问题我会向人们指出,所以就这样吧。)

DoubleDecimal 有什么区别? 您应该在什么时候(在什么情况下)始终使用Double? 您应该在什么时候(在什么情况下)始终使用Decimal? 在不属于上述两个阵营之一的情况下,需要考虑的驱动因素是什么

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

【问题讨论】:

另见***.com/questions/803225/…,不过这里主要讨论的是植入细节,而不是“为什么” Difference between decimal, float and double in .NET?的可能重复 【参考方案1】:

我通常会考虑 自然人造 的数量。

自然量是指体重、身高和时间。这些永远不会绝对准确地测量,并且很少有绝对精确的算术概念:您通常不应该将高度相加,然后确保结果完全符合预期。对于这种数量,请使用double。双打的范围很大,但精度有限;它们也非常快。

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

如需更多信息,我有关于 .NET binary floating point types 和 .NET decimal type 的文章。 (请注意,decimal 也是浮点类型 - 但有问题的“点”是小数点,而不是二进制点。)

【讨论】:

“它也比十进制慢,但我个人有一个银行账户”... - 我相信你想说“它也比 double 慢”: )【参考方案2】:

如果您想保持真正的精度,请使用 十进制

如果要比较值,请保留 十进制

如果你使用 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 的评论是正确的 - 我已经知道双精度和小数的行为,但是小数给您“真正的精度”的想法对于任何直观的“真正的精度”概念都是误导性的。【参考方案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 中,如何在十进制和双精度之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中十进制、浮点和双精度的区别?

.NET 中十进制、浮点和双精度的区别?

mysql十进制和双精度数据问题

单精度和双精度浮点值有啥不同? [复制]

与浮点数和双精度相关的概念

double精确到几位小数